gaacode
gaacode

Reputation: 25

many-to-many relationship in rails

I have the following models

class Order < ApplicationRecord
  has_many :order_details
  has_many :products, through: :order_details
end

class OrderDetail < ApplicationRecord
  belongs_to :order
  belongs_to :product
end

class Product < ApplicationRecord
  has_many :order_details
  has_many :orders, through: :order_details
end

And I already have product records in my database. Now, if using syntax: Order.create name: 'HH', product_ids: [1,2]

1 Order record is created, and rails automatically creates 2 more OrderDetail records to connect that Order record with 2 Products.

This syntax is quite handy.

Now, I want to learn more about it from the Rails documentation. But now i still can't find the documentation about it. Can someone help me find documents to learn more?

[Edit] Additional: I'd like to find documentation on the Rails syntax that allows passing a list of ids to automatically create records in the intermediate table, like the Order.create syntax with ```product_ids` `` that I gave above.

Upvotes: -2

Views: 313

Answers (1)

lestra
lestra

Reputation: 312

The extensive documentation is at https://api.rubyonrails.org/, and many-to-many is here.

The essential part is to analyze the source code of Rails at Module (ActiveRecord::Associations::CollectionAssociation) and at id_writers method:

  # Implements the ids writer method, e.g. foo.item_ids= for Foo.has_many :items
  def ids_writer(ids)
    primary_key = reflection.association_primary_key
    pk_type = klass.type_for_attribute(primary_key)
    ids = Array(ids).compact_blank
    ids.map! { |i| pk_type.cast(i) }
    # .... code continues

We see that ids parameter (ex.: [1,2]) is first checked to be Array then the compact_blank method removes all falses values, after that, ids are casted to match primary_key type of the model (usually :id). Then code continues to query database with where to get found ids (associations) and saves.

Upvotes: -1

Related Questions