我有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关系的方法。
由于
答案 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提示。