【问题标题】:Update_all query with joins in rails console在 Rails 控制台中使用联接的 Update_all 查询
【发布时间】:2019-10-20 05:39:23
【问题描述】:

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

应用程序.rb has_many :trackers

tracker.rb

belongs_to :应用程序

我想要做的是将跟踪器表中的 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")

知道我哪里出错了。

【问题讨论】:

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


    【解决方案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"
    

    【讨论】:

    • TypeError(不能引用 ActiveRecord::Relation)
    • @Navroop 现在试试?我将其更改为 SQL 字符串
    【解决方案2】:

    好像有错别字

    如果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)
    

    【讨论】:

    • 我试过了,但还是报错。ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "applications")
    • @Navroop references(:application) 只需添加查询,希望它可以工作。
    • 我也试过这个。但它仍然是同样的错误。如果我删除 update_all 部分以查看查询是否获取所有跟踪器记录,则它可以工作,但不适用于 update_all
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多