在连接中具有大于条件的Rails

时间:2018-06-05 22:04:56

标签: ruby-on-rails-4 join where-clause

我有四种模式的层次结构:

Order

Job
  belongs_to :order

Task
  belongs_to :job
  belongs_to :agent

Agent 

我正在尝试搜索分配给代理的所有任务,其中父(祖父母?)订单的due_date大于DateTime.now。

我似乎无法为此搜索获得正确的语义。我最接近的是

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

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

2 个答案:

答案 0 :(得分:2)

将字符串传递给where方法时,需要将其写为有效的SQL查询。在您的情况下,问题是您如何引用表名称。虽然rails可以解析Hash结构并通过belongs_tohas_many的声明,但可以理解以下含义

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

数据库不了解如何处理以下内容。

tasks.job.order.due_date

它也不需要。由于您已使用joins(job: :order)指定了表格的链接方式,因此您需要在where调用中说明以下内容:

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

答案 1 :(得分:0)

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

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。

另外,如果你使用不同的关联,你的has_many班级或Order是否有has_many :through条款?