そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

rails - has_many through:

他対他 の関連を参照する

元々は他対他を直接参照できるようにするもの。

+-------+       +-----------+       +-----+
|Product| 1---n |OrderDetail| n---1 |Order|
+-------+       +-----------+       +-----+

例えば、特定の Order中の Productを調べたい場合など。

class Product < ActiveRecord::Base
  has_many :order_details
  has_many :orders, through: :order_details
end

class Order < ActiveRecord::Base
  has_many :order_details
  has_many :products, through: :order_details
end

class OrderDetail < ActiveRecord::Base
  belongs_to :product
  belongs_to :order
end

こうすると、

@orders = @product.orders

として参照できる

カスケードした関連を直接参照する
+----+       +----+       +-----+
|User| 1---n |Blog| 1---n |Entry|
+----+       +----+       +-----+

User から Entry のアイテムを直接参照できるようにする。

class User < ActiveRecord::Base
  has_many :blogs
  has_many :entries, through: :blogs
end

class Blog < ActiveRecord::Base
  has_many :entries
  belongs_to :user
end

class Entry < ActiveRecord::Base
  belongs_to :blog
end

次のように参照できる。

@user.entries

ただし、次のように作成することはできない。

@user.entries.create title: "ほげ"

1対多のカスケードとなっているため Blog が特定できない。
Blog の id を指定し追加する。

@blog = Blog.find @blog_id
@blog.entries.create title: "ほげ"