在Rails控制台中使用Join的Update_all查询

时间:2019-06-04 16:44:36

标签: ruby-on-rails ruby-on-rails-5 psql rails-console

我有一个跟踪器表和应用程序表

application.rb has_many:trackers

tracker.rb

属于:application

我想做的是仅将那些check_in_date等于“ 2019-05-30”的记录更新为要查询的应用程序表中的begin_date的跟踪器表中的check_in_date。

我正在尝试运行下面的命令,但出现错误。

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 个答案:

答案 0 :(得分:1)

也许尝试一下:

请注意,我不知道这是否行得通,因此除非您可以确认,否则请勿在生产中使用

  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"

答案 1 :(得分:0)

似乎有错字

如果check_in_datedate类型,则转换日期是"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)