Rails 5 получает ассоциацию ассоциации

Rails 5 с использованием filterrific для фильтрации модели с полиморфной ассоциацией по атрибуту ассоциации.

Flag
  belongs_to :flaggable, polymorphic: true
  belongs_to :reporter, class_name: "User"

Post
 belongs_to :user
 has_many :flags, as: :flaggable

Comment
 belongs_to :user
 has_many :flags, as: :flaggable

Чтобы filteriffic работал, ему нужна область, определенная в модели, и я пытаюсь получить любой отмеченный пост или комментарий, принадлежащий определенному пользователю. flag.flaggable.user.id работает правильно, но я не могу правильно определить область действия.

scope :with_owner_name, lambda { |post_owner|
    includes(flaggable: :user).where( :post => {:user => [*post_owner]} )
  }

or

scope :with_owner_name, lambda { |post_owner|
        includes(flaggable: :user).where( :flaggable => {:user => [*post_owner]} )
      }

возвращается

Не удается быстро загрузить полиморфную ассоциацию :flaggable

и попытка включить каждую помеченную модель по отдельности делает то же самое. Есть ли способ сделать это? Я ничего не могу найти в документации filterrific о полиморфных областях. Должен ли я вместо этого иметь связь между флагом и пользователем сообщения/комментария?


person Jim Hogan    schedule 17.02.2017    source источник


Ответы (1)


Это не специфическая фильтрующая проблема. Работа с полиморфными отношениями может быть болезненной, у меня были подобные случаи, и я думаю, что в конце концов я сделал ручное соединение, чтобы исправить это.

Можете ли вы попробовать, если это работает?

joins("INNER JOIN flags ON flags.flaggable_id = posts.id AND flags.flaggable_type = 'Post' INNER JOIN users ON users.id = flags.user_id")

E.g.

scope :with_owner_name, lambda { |post_owner|
    joins("INNER JOIN flags ON flags.flaggable_id = posts.id AND flags.flaggable_type = 'Post' INNER JOIN users ON users.id = flags.user_id").where( :post => {:user => [*post_owner]} )
}
person edwardmp    schedule 08.03.2017