我想知道在has_many :through关联中从join模型中选择属性的最简单/最优雅的方法是什么。
假设我们有Items、Catalogs和CatalogItems,以下是Item类的定义:
此外,假设CatalogueItems具有位置属性,并且在任何目录和任何项目之间只有一个CatalogueItem。
检索位置属性最明显但略微令人沮丧的方法是:
假设我们有Items、Catalogs和CatalogItems,以下是Item类的定义:
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的第一个目录对应的位置,所以我们应该能够执行@item.catalogs.first.position。
我找到的唯一方法是:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end
现在我可以使用Item.catalogs.first.position。然而,这似乎有点像一个hack-我正在为Catalog实例添加一个额外的属性。这也打开了尝试在两种不同情况下使用视图(其中一种情况下,我用Catalog.find来填充@catalogs,另一种情况下,我用@item.catalogs填充)的可能性。在一种情况下,位置将在那里,在另一种情况下,位置则不存在。
有人有好的解决方案吗?
谢谢。
catalog_items.find_by_catalogue_id
就可以了。 - Ryan Bigg