代码之家  ›  专栏  ›  技术社区  ›  Ethan Ryan

动态更新rails/activerecord/sql数据库

  •  -2
  • Ethan Ryan  · 技术社区  · 7 年前

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

    我已经有了每个故事的用户ID属性。

    我最近还为我的所有故事添加了用户名属性。

    现在所有这些用户名属性都为零。

    在控制台里,我可以 Story.first.user_name = Story.first.user.name 将user_name属性设置为第一个故事的user.name值。

    我如何在PostgreSQL数据库中迭代我的所有故事并动态更新每个故事的用户名值?

    我想使用一些类似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 回复  |  直到 7 年前
        1
  •  1
  •   lacostenycoder    7 年前

    最简单的方法是迭代Stories表中的所有记录:

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