Ruby on rails Rails包括非主键上的连接
我有2个Rails型号Order和CustomLogo,我想阻止对某些代码进行n+1查询,这些代码可以恢复到:Ruby on rails Rails包括非主键上的连接,ruby-on-rails,activerecord,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 基本上我想做的是定义一个has_one:custom_logo on Order,它将执行与上面的查询匹配的正确连接并使用Order。包括:cus
Order.where(some_query).each do |order|
CustomLogo.find_by client_id: order.client_id, origin_value: order.origin
end
基本上我想做的是定义一个has_one:custom_logo on Order,它将执行与上面的查询匹配的正确连接并使用Order。包括:custom_logo
然后,代码将变为
Order.where(some_query).includes(:custom_logo).each do |order|
order.custom_logo
end
然而,我没有找到一种方法来定义适当的has_one关系
谢谢您可以通过重新定义条件过程中的位置来处理没有外键的关联:
帽子提示@dwighton。数据库中这些表之间的实际关系是什么?您应该这样声明它,然后使用适当的技术来避免n+1。但如果它真的不是,你也不想宣布它是有的。谢谢汤姆的建议。那真是太好了。但是,它并没有真正解决这里的问题,因为它提供了一个working has_one关系,这将改进代码,但是include在动态关系上不起作用,因为在这种情况下,传递给lambda的实例为nil。我的结论是,我希望实现的目标没有得到框架的支持。我目前的解决方案是在检索订单后手动执行第二次查询,一次检索所有徽标这是inludes无论如何都会有的。includes子句的优点是,你说得对。像这样的关联在助手方法方面也有其他缺陷;Order.first.create_custom_logo行为不稳定,Order.first.custom_logo=CustomLogo.last会引发异常,因为它正在尝试分配外键。看看它是怎么坏的,真的很有趣。
class Order < ApplicationRecord
has_one :custom_logo,
->(order) {
unscope(:where).where(origin_value: order.origin, client_id: order.client_id)
}
end