У меня есть модель данных примерно так:
# columns include collection_item_id, collection_id, item_id, position, etc
class CollectionItem < ActiveRecord::Base
self.primary_key = 'collection_item_id'
belongs_to :collection
belongs_to :item
end
class Item < ActiveRecord::Base
has_many :collection_items
has_many :collections, :through => :collection_items, :source => :collection
end
class Collection < ActiveRecord::Base
has_many :collection_items, :order => :position
has_many :items, :through => :collection_items, :source => :item, :order => :position
end
Предмет может появляться в нескольких коллекциях, а также более одного раза в одной коллекции в разных позициях.
Я пытаюсь создать вспомогательный метод, который создает меню, содержащее каждый элемент в каждой коллекции. Я хочу использовать collection_item_id для отслеживания текущего выбранного элемента между запросами, но я не могу получить доступ к каким-либо атрибутам модели соединения через класс Item.
def helper_method( collection_id )
colls = Collection.find :all
colls.each do |coll|
coll.items.each do |item|
# !!! FAILS HERE ( undefined method `collection_item_id' )
do_something_with( item.collection_item_id )
end
end
end
Я тоже это пробовал, но и с ошибкой (неопределенный метод `collection_item ')
do_something_with( item.collection_item.collection_item_id )
Редактировать: спасибо serioys sam за указание на то, что вышеприведенное явно неверно
Я также пытался получить доступ к другим атрибутам в модели соединения, например:
do_something_with( item.position )
и
do_something_with( item.collection_item.position )
Редактировать: спасибо serioys sam за указание на то, что вышеприведенное явно неверно
но они тоже терпят неудачу.
Может кто-нибудь посоветовать мне, как поступить с этим?
Редактировать: -------------------->
Из онлайн-документации я обнаружил, что использование has_and_belongs_to_many будет прикреплять атрибуты объединяемой таблицы к полученным элементам, но, видимо, это не рекомендуется. Я еще не пробовал.
В настоящее время я работаю над внесением поправок в мою коллекционную модель следующим образом:
class Collection < ActiveRecord::Base
has_many :collection_items, :order => :position, :include => :item
...
end
и изменение помощника для использования coll.collection_items вместо coll.items
Редактировать: -------------------->
Я поменял своего помощника на работу, как указано выше, и она отлично работает - (спасибо Сэм)
Это испортило мой код - из-за других факторов, не детализированных здесь - но ничего, что час или два перефакторинга не уладят.