Мне интересно, каков самый простой / самый элегантный способ выбора атрибутов из моделей соединения в has_many: через ассоциации.
Допустим, у нас есть элементы, каталоги и элементы каталога со следующим классом элементов:
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. Тем не менее, это похоже на хак - я добавляю дополнительный атрибут в экземпляр каталога. Это также открывает возможность попытки использовать представление в двух разных ситуациях, когда я заполняю @catalogs с помощью Catalog.find или с помощью @ item.catalogs. В одном случае позиция будет там, а в другом - нет.
У кого-нибудь есть хорошее решение для этого?
Спасибо.