Рельсы, где в соединении больше условия - PullRequest
0 голосов
/ 06 июня 2018

У меня есть иерархия из четырех моделей:

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 голосов
/ 06 июня 2018

Когда вы передаете строки в метод 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)
0 голосов
/ 06 июня 2018

Вы пытались создать условие заполнителя, например:

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, если вы используете другую ассоциацию?

...