Я не знаю действительно чистого способа сделать это ... это неуклюжий, но должен работать, но это не очень хорошо расширяемый. Надеюсь, у Сомоне есть лучший ответ.
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'])