如何通过属性来定位多态关联

问题描述 投票:1回答:1

我想根据多态关联的属性编写范围。

我有模特:

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

教师和学生都有属性名称,我想将该属性用于范围,如:

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

有什么办法可以很好地适应这个范围,因为我不能只提到范围吗?

ruby-on-rails scope polymorphic-associations
1个回答
1
投票

我不知道一个非常干净的方式这样做...这很笨重但应该工作,但它不是很好的可扩展。希望somone有更好的答案。

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'])
© www.soinside.com 2019 - 2024. All rights reserved.