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_date
是 date
类型那么转换是 "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"
我有一个跟踪器 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_date
是 date
类型那么转换是 "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"