Rails: готовая ассоциация загрузки с trackable_type в области видимости - PullRequest
0 голосов
/ 24 января 2019

Это сложный вопрос.

У меня есть 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 } ) }

Ответы [ 2 ]

0 голосов
/ 26 января 2019

прибил его!Если вы добавите область непосредственно в строку belongs_to, ассоциации будут загружены с этой областью.

class Activity < ActiveRecord::Base
    belongs_to :trackable, -> { include_all } , polymorphic: true
    ...
end
0 голосов
/ 24 января 2019

Вы можете определить дополнительную parent ассоциацию для Answer и Post, чтобы расширить интерфейс вашего trackable типа утки:

class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :parent, class_name: :Question, foreign_key: :question_id
  ...
end
class Post < ActiveRecord::Base
  belongs_to :blog
  belongs_to :parent, class_name: :Blog, foreign_key: :blog_id
  ...
end
class Activity < ActiveRecord::Base
  scope :include_all, -> { includes(trackable: :parent) }
  ...
end
...