Rails活动记录查询与多个关联

时间:2015-08-05 12:24:57

标签: ruby-on-rails ruby activerecord orm

我有一个名为usersordersdelivery_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使用包括这个查询工作,即使我知道有一个使用连接的解决方案?

2 个答案:

答案 0 :(得分:0)

这种查询需要连接,因为您需要delivery_times表和users表的联合知识。

includes实际上做的是自动决定preloadeager_load,并尝试始终采取更好的做法。在你的情况下它会做eager_load;看看这个article

对于你得到的错误,我想你的结果是从Users开始而不是User

User.includes(order: :delivery_time).where("delivery_times.start < ?",Time.now)

其他一切对我来说都是正确的。

答案 1 :(得分:0)

您的模型之间关系的更好定义是:

Relationships between models

所以你的课程看起来像这样:

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