Запрос Update_all с объединениями в консоли rails - PullRequest
0 голосов
/ 04 июня 2019

У меня есть таблица трекеров и таблицы приложений

application.rb has_many: трекеры

tracker.rb

принадлежат_то: приложение

Что я пытаюсьдля этого нужно обновить check_in_date в таблице трекеров для запроса на begin_date в таблицах приложений только для тех записей, у которых check_in_date равно «2019-05-30».

Я пытаюсь запустить командуниже, но я получаю ошибку.

Tracker.joins(:application).where("check_in_date = ?", "2019-05-30").update_all("tracker.check_in_date = application.begin_date")

ошибка

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "application")

Любая идея, где я иду не так.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Может быть, попробуйте это:

Примечание. Я понятия не имею, сработает ли это, поэтому не делайте это в производстве, если вы не можете подтвердить

  Tracker.where(check_in_date: "2019-05-30")
    .update_all("check_in_date = (#{  
         Application.select(:begin_date)
           .where('applications.id = trackers.application_id').to_sql})"
  )

.Теория заключается в том, что это должно привести к следующему SQL

  UPDATE trackers 
  SET check_in_date = (
     SELECT 
        begin_date
     FROM 
        applications 
     WHERE 
        applications.id = trackers.application_id
  ) 
  WHERE 
    trackers.check_in_date = "2019-05-30"
0 голосов
/ 04 июня 2019

Кажется, опечатка

, если check_in_date является date типом, тогда конвертировать будет "2019-05-30" в дате

my_check_in_date = "2019-05-30".to_date

При использовании любого attribute в имени модели запроса всегда должно быть множественное число

Tracker.joins(:application)
          .where("trackers.check_in_date= ?", my_check_in_date)
          .update_all("trackers.check_in_date = applications.begin_date")
          .references(:application)
...