2012-03-20 51 views
4

我正在开发一个rails项目。 我有两个表存储来自不同系统的数据:任务和项目。rails活动记录:更新加入的表

有了一个条件,Projects通过ref_id知道任务,但不是相反的方向。 因此,一旦匹配找到从联接,我想设置task.project_id与匹配的项目表的ID。

UPDATE FROM task AS t 
LEFT JOIN projects as p 
ON t.ref_id = p.ref_id 
SET t.project_id = p.id 

我的问题在这里是:我怎么能实现这个使用轨道中的活动记录?

回答

0

你可以做到这一点通过你的SQL直接

Task.connection.update_sql("UPDATE FROM task AS t LEFT JOIN projects as p ON t.ref_id = #{p.ref_id} SET t.project_id = #{p.id}") 
1

Task.joins(:项目).update_all( “tasks.project_id = projects.id”)

+0

这正是你所做的全部保存在'ActiveRecord'中。 – bschaeffer 2014-09-11 12:47:11

+15

抛出:“ActiveRecord :: StatementInvalid:PG :: UndefinedTable:错误:缺少表”项目“的FROM子句条目。 Rails 4.2 – RAJ 2015-04-20 10:33:41

1

如果你使用的是Postgres你可以运行从模型中的“加入”像update_all

Task.connection.update_sql("UPDATE tasks AS t SET project_id = p.id FROM projects AS p WHERE t.ref_id = p.ref_id")

注:update_sql调用已为铁路s 5并且应该切换到只是update

由于您直接发送sql,因此您需要确保使用的语法适合您的数据库。