Update_all 在 rails 控制台中进行联接查询

Update_all query with joins in rails console

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

application.rb has_many:跟踪器

tracker.rb

belongs_to:申请

我想做的是将跟踪器 table 中的 check_in_date 更新为应用程序 table 中的 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")

知道我哪里出错了。

好像有错别字

如果 check_in_datedate 类型那么转换是 "2019-05-30" in date

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)

也许试试这个:

请注意,我不知道这是否可行,所以请不要在生产环境中这样做,除非您可以确认

  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"