has_many :through アソシエーションの結合モデルから属性を選択する最も簡単でエレガントな方法は何だろうと思っています。
次の Item クラスを持つ Item、Catalog、および CatalogItems があるとします。
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items
end
さらに、CatalogueItems に position 属性があり、任意のカタログと任意のアイテムの間に CatalogueItem が 1 つしかないとします。
位置属性を取得するための最も明白ですが、少しイライラする方法は次のとおりです。
@item = Item.find(4)
@catalog = @item.catalogs.first
@cat_item = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position = @cat_item.position
@item.catalogs.first.position を実行できるように見えるので、これは面倒です。これは、必要な位置 (@item の最初のカタログに対応する位置) を完全に指定したためです。
これを取得するために私が見つけた唯一の方法は次のとおりです。
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end
これで、Item.catalogs.first.position を実行できます。ただし、これはちょっとしたハックのように思えます。Catalog インスタンスに追加の属性を追加しています。また、@catalogs に Catalog.find または @item.catalogs を入力する 2 つの異なる状況でビューを使用しようとする可能性も開きます。ポジションが存在する場合もあれば、存在しない場合もあります。
誰もこれに対する良い解決策を持っていますか?
ありがとう。