【发布时间】:2019-03-25 22:33:40
【问题描述】:
我有一个充满故事的数据库,每个故事都属于一个用户。
我已经为每个故事设置了一个 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 中编写正确的命令。
【问题讨论】:
-
您能否说明您要用于更新数据的逻辑?另外,如果您已经在用户模型中拥有该数据,为什么还需要故事中的字段?您是否有理由要在数据库中复制数据?
-
在数据库中,我想遍历每个故事,并更新其 user_name 属性。每个故事都属于一个用户,所以我想将每个 user_name 设置为每个故事的 user.name 值。
-
但是,如果您已经有一个有名字的用户,为什么还要复制这些数据呢?另外,什么时候应该进行这种数据迁移?听起来你只需要写一个数据迁移。
-
我不想再显示每个故事的所有用户数据,因为这些数据包括电子邮件地址和我在 API 端点中不需要或不想要的其他信息。我只希望每个故事都有一个 user_name 属性。
-
我的问题是:如何使用 update_all 动态更新属性?
标签: sql ruby-on-rails ruby postgresql rails-activerecord