Rails包括非主键的连接

时间:2018-01-31 23:17:55

标签: ruby-on-rails activerecord

我有2个Rails模型Order和CustomLogo,并且希望阻止对可以恢复的某些代码进行n + 1查询:

Order.where(some_query).each do |order|
  CustomLogo.find_by client_id: order.client_id, origin_value: order.origin
end

基本上我想要做的是在Order上定义一个has_one:custom_logo(这将与上面的查询匹配正确的连接)并使用Order.includes(:custom_logo)

然后代码将成为

Order.where(some_query).includes(:custom_logo).each do |order|
  order.custom_logo
end

但是我找不到为此定义正确的has_one关系的方法。

由于

1 个答案:

答案 0 :(得分:1)

您可以通过在条件where中重新定义proc来处理没有外键的关联:

class Order < ApplicationRecord
  has_one :custom_logo, 
    ->(order) { 
      unscope(:where).where(origin_value: order.origin, client_id: order.client_id) 
    }
end

this answer上给@dwight提示。