5

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

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

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 是否有办法在出现一组员工时自动执行此操作,或者我是否为了简单而过度伸张?

4

2 回答 2

-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

它和你想象的一样简单。希望它会有所帮助。谢谢

于 2013-09-07T08:08:45.123 回答
-1

In order to accomplish this with a single query in Rails 5 (which has come out since this question), you could do:

Phone.where(phoneable: employees) 

Rails will be able to infer the id and type from the objects in the employees collection.

于 2018-09-18T22:49:13.450 回答