Как определить полиморфную ассоциацию по атрибуту - PullRequest
1 голос
/ 04 апреля 2019

Я хочу написать область на основе атрибута из полиморфной ассоциации.

У меня есть модели:

class Item < ApplicationRecord

  belongs_to :person, polymorphic: true

end

class Teacher < ApplicationRecord

  has_many :items, as: :person

end

class Student < ApplicationRecord

  has_many :items, as: :person

end

Обе Учитель и Ученик есть атрибут name , и я хочу использовать этот атрибут для области видимости, например:

scope :by_name, ->(name) { joins(:person).where(persons: {name: name}) }

Можно ли как-то масштабировать эту область, поскольку я не могу просто упомянуть область действия?

1 Ответ

1 голос
/ 04 апреля 2019

Я не знаю действительно чистого способа сделать это ... это неуклюжий, но должен работать, но это не очень хорошо расширяемый. Надеюсь, у Сомоне есть лучший ответ.

scope :by_name, ->(name) { joins("left join teachers on person_type = 'Teacher' and person_id = teachers.id")
                          .joins("left join students on person_type = 'Student' and person_id = students.id")
                          .where('teachers.name = ? OR students.name = ?', name, name) }

Чтобы обработать массив имен, вы можете изменить его следующим образом ...

scope :by_name, ->(*name) do
  name = name.flatten
  joins("left join teachers on person_type = 'Teacher' and person_id = teachers.id")
  .joins("left join students on person_type = 'Student' and person_id = students.id")
  .where('teachers.name IN (?) OR students.name IN (?)', name, name) 
end

это позволит вам сделать

item.by_name('Smith')
item.by_name('Smith', 'Jones')
item.by_name(['Smith', 'Jones'])
...