我有一个充满故事的数据库,每个故事都属于一个用户。
每个故事我已经有一个user_id属性。
我最近也在所有故事中添加了一个user_name属性。
现在所有这些user_name属性均为nil。
在控制台中,我可以执行Story.first.user_name = Story.first.user.name
来将user_name属性设置为第一个故事的user.name值。
如何遍历Postgresql数据库中的所有故事并动态更新每个故事的user_name值?
我想使用ActiveRecord之类的update_all方法,但要带有动态参数。
我在Rails控制台中尝试过:
Story.update_all('user_name = Story.user.name')
但返回了:
SQL (36.2ms) UPDATE "stories" SET user_name = Story.user.name
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "user"
LINE 1: UPDATE "stories" SET user_name = Story.user.name
^
: UPDATE "stories" SET user_name = Story.user.name
from (irb):14
不确定如何在原始SQL中使用FROM,或如何在ActiveRecord中编写正确的命令。
答案 0 :(得分:1)
最简单的方法是遍历Storys表中的所有记录:
Story.find_each {|story| story.update(user_name: story.user.name)}
如果您的目标不是像update_all
那样修改时间戳或验证,则可以
Story.find_each {|story| story.update_column(:user_name, story.user.name)}