我写了一个有效的方法,但感觉不够优雅。我想知道我是否错过了更好的方式。
我有一个像这样的多态关联设置;
class Employee < ActiveRecord::Base
has_many :phones, as: :phoneable
end
class Client < ActiveRecord::Base
has_many :phones, as: :phoneable
end
class Phone < ActiveRecord::Base
belongs_to :phoneable, polymorphic: true
end
我的手机桌有标准phoneable_id:integer
和phoneable_type:string
列。
我想要做的是获取之前选定的一组员工的所有电话,例如
employees = Employee.where role: 'peon'
如果这是一个正常的has_many
关系,我会将我的手机查询写为;
Phone.where employee_id: employees
为了在多态关系中执行此操作,我将查询编写为;
Phone.where phoneable_type: 'employee', phoneable_id: employees
这很有效,但我觉得应该有更好的方法来明确说明phoneable_type
。 Rails是否有办法在提供一系列员工时自动执行此操作,或者我是否为了简单而过度使用?
答案 0 :(得分:-1)
您不了解多态关联的完整重要性。如果您已在模型中定义了它,则可以轻松地按如下方式获取记录:
让我们假设您的员工表中有'Peon'角色:
@employee = Employee.where(role: 'peon').first
现在你可以获取这样的记录:
@employee.phones
如果您想为拥有'peon'角色的员工提取所有手机,您可以这样做:
@employees = Employee.where(role: 'peon')
@peon_phones = @employees.map{|x| x.phones}
同样适用于客户:
@client = Client.first
@client.phones
它就像你想象的那样简单。希望它会有所帮助。谢谢
答案 1 :(得分:-1)
为了通过Rails 5中的单个查询(此问题之后出现)来完成此操作,您可以执行以下操作:
Phone.where(phoneable: employees)
Rails将能够从employees
集合中的对象推断ID和类型。