我有一个跟踪器表和应用程序表
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")
任何想法,我要去哪里错了。
答案 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_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)