我有四种模式的层次结构:
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)
但该语法不正确。什么是正确的方法?
答案 0 :(得分:2)
将字符串传递给where
方法时,需要将其写为有效的SQL查询。在您的情况下,问题是您如何引用表名称。虽然rails可以解析Hash结构并通过belongs_to
和has_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
条款?