我想知道从 has_many 中的连接模型选择属性的最简单/最优雅的方法是什么:通过关联。
假设我们有具有以下 Item 类的 Items、Catalogs 和 CatalogItems:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items
end
此外,假设 CatalogueItems 具有位置属性,并且任何目录和任何项目之间都只有一个 CatalogueItem。
检索位置属性的最明显但有点令人沮丧的方法是:
@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 实例上添加了一个额外的属性。它还提供了尝试在两种不同情况下使用视图的可能性,其中我使用 Catalog.find 或 @item.catalogs 填充 @catalogs。在一种情况下,该位置将会存在,而在另一种情况下,则不会。
有人对此有好的解决方案吗?
Thanks.