我有一个名为users
,orders
和delivery_times
的表,它们使用以下关系进行链接。
表User
:
belongs_to :orders
表orders
:
belongs_to :delivery_times
我想使用表delivery_times上的条件对表用户编写查询,如下所示:
User.includes(order: :delivery_time).where("delivery_times.start < ?",Time.now)
PG :: UndefinedTable:错误:表格#34; delivery_times&#34;
缺少FROM子句条目
但是我收到错误。我是否可以使用RoR ORM使用包括这个查询工作,即使我知道有一个使用连接的解决方案?
答案 0 :(得分:0)
这种查询需要连接,因为您需要delivery_times
表和users
表的联合知识。
includes
实际上做的是自动决定preload
和eager_load
,并尝试始终采取更好的做法。在你的情况下它会做eager_load
;看看这个article。
对于你得到的错误,我想你的结果是从Users
开始而不是User
:
User.includes(order: :delivery_time).where("delivery_times.start < ?",Time.now)
其他一切对我来说都是正确的。
答案 1 :(得分:0)
您的模型之间关系的更好定义是:
所以你的课程看起来像这样:
class User < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :user
has_one :delivery_time
end
class DeliveryTime < ActiveRecord::Base
belongs_to :order
end
您正在进行的查询没有任何意义吗?你期待的结果是什么?
如果您想获得他们的交货时间是特定时间的订单,您可以使用范围:
class Order < ActiveRecord::Base
belongs_to :user
has_one :delivery_time
scope :ready_to_deliver, includes(:delivery_time).where("delivery_time.start < ? ", Time.now)
end
然后您可以获得准备好的订单:
ready_orders = Order.ready_to_deliver