如何在多态关联中获取特定类型的所有子项

时间:2013-09-07 07:42:39

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord polymorphic-associations

我写了一个有效的方法,但感觉不够优雅。我想知道我是否错过了更好的方式。

我有一个像这样的多态关联设置;

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:integerphoneable_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是否有办法在提供一系列员工时自动执行此操作,或者我是否为了简单而过度使用?

2 个答案:

答案 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和类型。