Мне интересно, какой самый простой/самый элегантный способ выбора атрибутов из моделей join в has_many: через ассоциации.Элегантный выбор атрибутов из has_many: через модели объединения в Rails
Допустит, у нас есть товары, каталоги и 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. Однако это кажется немного взломанным - я добавляю дополнительный атрибут в экземпляр Каталога. Это также открывает возможность попытаться использовать представление в двух разных ситуациях, когда я заполняю @catalogs каталогом или каталогом @ item.catalogs. В одном случае позиция будет там, а в другой - нет.
У кого-нибудь есть хорошее решение?
Спасибо.
Метод экземпляра работает, но по-прежнему кажется, что должен быть лучший способ. Мне не нужен первый каталог, я просто использовал его в качестве примера. Думаю, вы могли бы сделать @ item.position_in_catalog (catalog_id). – arjun
Да, это действительно легко переписать для @ otem.position_in_catalog (каталог). Однако я не вижу другого способа, как вы могли бы реализовать то, что хотите. –
@ item.catalogs.first.position <- это вообще не указывает какую-либо позицию. С помощью @ item.catalogs вы просто указываете подмножество всех каталогов, из которых вы затем выбираете первый.Итак, что вы в конечном итоге - это просто каталог, который агностик о том, как вы его получили. –