渴望加载多态关联

时间:2014-07-07 06:56:23

标签: ruby-on-rails postgresql ruby-on-rails-4

我有三种模式:

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)

1 个答案:

答案 0 :(得分:0)

你可以这样做:

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

它会将所有销售记录及其客户和个人资料嵌入其中,您可以在Sale对象上使用它:

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

尽管如此,我认为这将是一种代价高昂的方法,因为我可以看到总共会有3个SQL查询来获取所有记录,其中2个使用IN (),我认为这些成本很高。因此,在这种情况下我们最好采用LEFT JOIN。

@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"')
相关问题