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

动态更新Rails/ActiveRecord/SQL数据库,sql,ruby-on-rails,ruby,postgresql,rails-activerecord,Sql,Ruby On Rails,Ruby,Postgresql,Rails Activerecord,我有一个充满故事的数据库,每个故事都属于一个用户 我已经为每个故事设置了一个user_id属性 我最近还为我的所有故事添加了一个用户名属性 现在所有这些用户名属性都是nil 在控制台中,我可以执行Story.first.user\u name=Story.first.user.name将user\u name属性设置为第一个故事的user.name值 如何迭代Postgresql数据库中的所有故事并动态更新每个故事的用户名值 我想使用类似ActiveRecord的update_all方法的东西,

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

我已经为每个故事设置了一个user_id属性

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

现在所有这些用户名属性都是nil

在控制台中,我可以执行
Story.first.user\u name=Story.first.user.name
将user\u name属性设置为第一个故事的user.name值

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

我想使用类似ActiveRecord的update_all方法的东西,但要使用动态参数

我在Rails控制台中尝试:

Story.update\u all('user\u name=Story.user.name')

但结果是:

SQL(36.2ms)更新“故事”设置user\u name=Story.user.name
ActiveRecord::StatementInvalid:PG::UndefinedTable:错误:表“user”的子句条目中缺少
第1行:更新“故事”设置user\u name=Story.user.name
^
:更新“故事”设置user\u name=Story.user.name
起始(irb):14


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

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

Story.find_each {|story| story.update(user_name: story.user.name)}
如果您的目标不是像
update\u all
那样触摸时间戳或验证,那么您可以这样做

Story.find_each {|story| story.update_column(:user_name, story.user.name)}

你能说明一下你想用什么逻辑来更新数据吗?另外,如果用户模型中已经有数据,为什么需要在故事中添加字段?在数据库中,我希望迭代每个故事,并更新其user_name属性。每个故事都属于一个用户,因此我想将每个用户名设置为每个故事的user.name值。但是,如果您已经有一个具有用户名的用户,为什么要复制此数据呢?此外,这种数据迁移应该在什么时候发生?听起来您只需要编写一个数据迁移。我不再想显示每个故事的所有用户数据,因为这些数据包括电子邮件地址和其他我不需要或不想在API端点中显示的信息。我只希望每个故事都有一个用户名属性。我的问题是:如何使用update\u all动态更新属性?谢谢,这太棒了!我希望使用update_all,因为它不会在timestamp字段更新updated_,根据这里的第一条评论:有一种方法可以用sql实现这一点,但不是很简单。但是你为什么关心时间戳呢?这是一次性的吗?如果这是在生产数据中,则更建议在迁移中使用此选项。这是一次一次性运行,但我正在按前端表中的更新位置对我的故事进行排序,因此不想更新它们的时间戳。但是,如果不想更新user_name属性而不更新更新的_at值,那么我会将其标记为正确。有一种方法,但这是一个单独的问题。这是一个单独的问题吗?我的问题是:如何迭代我的Postgresql数据库中的所有故事并动态更新每个故事的用户名值?我想使用类似ActiveRecord的update_all方法的东西,但要使用动态参数。