2014-07-07 147 views
0

预先加载我有三个型号:与多态关联

User.rb 
belongs_to :profile, polymorphic: true 

Customer.rb 
has_one :user, as: :profile, dependent: :destroy 

Sale.rb 
belongs_to :customer 

我希望把所有与存储在用户模型客户的电子邮件的销售。做这个的最好方式是什么?

到目前为止,我有以下几点:

Sale.all.includes(:customer) 

回答

0

你可以做到这一点是:

@sales = Sale.includes(:customer => :user).all 

它会得到所有与他们的客户和型材销售记录嵌套到他们,你可以在Sale的物体上使用它:

@sales.first.customer.user.email #get the email for first Sale record. 

虽然,我认为这将是一个代价高昂的会面hod,因为我可以看到总共会有3个SQL查询来获取所有记录,其中2个使用的是IN(),我认为这有很大的代价。所以在这种情况下,我们最好用左连接。

@sales = Sale.joins('LEFT JOIN users ON sales.customer_id = users.profile_id AND users.profile_type = "Customer"') 

此查询将获得所有带有嵌套用户配置文件而没有客户数据/记录的销售记录。如果您需要的客户数据量太大,你可以随时去与此:

@sales = Sale.joins('LEFT JOIN customers ON sales.customer_id = customers.id LEFT JOIN users ON customers.id = users.profile_id AND users.profile_type = "Customer"') 
+0

感谢您的快速反应,但我得到以下错误:#<引发ArgumentError:错误的参数数目(0 1)>时我尝试@sales = Sale.includes(:customer =>:user).all – user3575214

+0

@ user3575214哦,你正在使用rails 4.试试'@sales = Sale.includes(:customer =>:user).all.to_a' –

+0

不,同样的错误消息 – user3575214