3

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

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]}) 
    } 

или

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

возвращает

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

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

ответ

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]}) 
}