Это сложный вопрос.
У меня есть Activity
модель:
class Activity < ActiveRecord::Base
belongs_to :trackable, polymorphic: true
scope :include_all, -> { includes(:trackable) }
...
end
Так что, если я сделаю:
@activities = Activity.include_all
Приведенный выше код работает хорошо, но что если я захочу также загрузить родителей отслеживаемой записи? Также у этих моделей разные родители:
Answer
модель:
class Answer < ActiveRecord::Base
belongs_to :question
has_many :activities, as: :trackable
scope :include_all, -> { includes(:question) }
...
end
Post
модель:
class Post < ActiveRecord::Base
belongs_to :blog
has_many :activities, as: :trackable
scope :include_all, -> { includes(:blog) }
...
end
Category
модель:
class Category < ActiveRecord::Base
has_many :activities, as: :trackable
scope :include_all, -> {}
...
end
Обратите внимание, что область действия include_all
в каждой модели показывает ассоциации, которые необходимо включить. Я пробовал
class Activity < ActiveRecord::Base
...
scope :include_all, -> { includes(trackable: :question) }
...
end
Это сломается, когда появится Activity
с trackable_type
= Post
.
Есть идеи?
Ответ Рика - очень хороший подход, но есть ли способ использовать область ассоциации внутри другой области? Это может пригодиться для ассоциаций без родителей, таких как Category
.
что-то вроде
scope :include_all, -> { includes(trackable -> { include_all } ) }