动态更新Rails / ActiveRecord / SQL数据库

时间:2018-10-21 20:04:26

标签: sql ruby-on-rails ruby postgresql rails-activerecord

我有一个充满故事的数据库,每个故事都属于一个用户。

每个故事我已经有一个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-error-missing-FROM-clause

不确定如何在原始SQL中使用FROM,或如何在ActiveRecord中编写正确的命令。

1 个答案:

答案 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)}