Мой код все еще находится в разработке, а не в производстве, и я натыкаюсь на стену, генерируя данные, которые мне нужны для некоторых представлений.
Не вдаваясь в подробности, я просто хочу пройтись по нескольким ассоциациям моделей, чтобы получить некоторую информацию на каждом уровне. Единственная ассоциация, вызывающая у меня проблемы, - это полиморфная own_to. Вот самые актуальные ассоциации
Model Post
belongs_to :subtopic
has_many :flags, :as => :flaggable
Model Subtopic
has_many :flags, :as => :flaggable
Model Flag
belongs_to :flaggable, :polymorphic => true
Я хотел бы отобразить несколько флагов в представлении индекса Flags #. Есть информация от других моделей, которую я тоже хочу отобразить, но я опускаю детали, чтобы упростить задачу.
В моем действии Flags_controller # index я сейчас использую @flags = paginate_by_sql
для извлечения всего, что мне нужно, из базы данных. Я могу успешно получить данные, но не могу загрузить связанные объекты модели (хотя все данные, которые мне нужны, находятся в памяти). Сейчас я рассматриваю несколько вариантов:
переписать мои представления для работы с данными SQL в объекте @flags. Это должно сработать и предотвратит 5-6 SQL-запросов модели ассоциации на строку на странице индекса, но будет выглядеть очень хакерским. Я бы хотел этого избежать, если возможно
упростить мои представления и создать дополнительные страницы для более подробной информации, которая будет загружаться только при просмотре одного отдельного флага
изменить иерархию / определения модели с полиморфных ассоциаций на наследование. Фактически создайте модуль или класс
FlaggableObject
, который будет родительским дляSubtopic
иPost
.
Я склоняюсь к третьему варианту, но не уверен, что смогу чисто извлечь всю нужную мне информацию, используя только помощники Rails ActiveRecord.
Я хотел бы узнать, сработает ли это, и, что более важно, есть ли у вас лучшее решение
РЕДАКТИРОВАТЬ: Некоторое придирчивое поведение include
, с которым я столкнулся
@flags = Flag.find(:all,:conditions=> "flaggable_type = 'Post'", :include => [{:flaggable=>[:user,{:subtopic=>:category}]},:user]).paginate(:page => 1)
=> (valid response)
@flags = Flag.find(:all,:conditions=> ["flaggable_type = 'Post' AND
post.subtopic.category_id IN ?", [2,3,4,5]], :include => [{:flaggable=>
[:user, {:subtopic=>:category}]},:user]).paginate(:page => 1)
=> ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :flaggable