Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails包括非主键上的连接_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails Rails包括非主键上的连接

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

我有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。包括: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