Rails where with greater than condition in join

Rails where with greater than condition in join

我有四个模型的层次结构:

Order

Job
  belongs_to :order

Task
  belongs_to :job
  belongs_to :agent

Agent 

我正在尝试搜索分配给 parent(大parent?)订单 due_date 大于 [=] 的代理的所有任务21=].

我似乎无法获得适合此搜索的语义。我最接近的是

agent.tasks.joins(job: :order)
           .where("task.job.order.due_date > ?", DateTime.now)

但该语法不正确。正确的做法是什么?

您是否尝试过创建占位符条件,例如:

agents.tasks.join(job: :order).where("taks.job.order.due_date > :due_date", {:due_date = DateTime.now})

但我不知道你为什么要在那里使用 DateTime 对象。有什么特别的原因吗?

我个人会

agents.tasks.join(job: :order).where("tasks.job.order.due_date > ?", Time.now.getutc)

或者如果你不使用UTC,你可以使用相应的TimeZone。

此外,如果您使用不同的关联,您的 Order class 或 has_many :through 中是否有 has_many 子句?

当您将字符串传递给 where 方法时,它要求您将其编写为有效的 SQL 查询。在您的情况下,问题在于您如何引用 table 名称。而rails可以解析一个Hash结构,通过belongs_tohas_many的声明,可以理解下面的意思

{ task: { job: { order: { due_date: Date.today } } } }

数据库不明白下面怎么办

tasks.job.order.due_date

而且也不需要。由于您已经通过使用 joins(job: :order) 指定了 table 是如何链接在一起的,因此您需要在 where 调用中说的内容如下:

.where("orders.due_date > ?", DateTime.now)