динамически обновлять базу данных Rails / ActiveRecord / SQL - PullRequest
0 голосов
/ 21 октября 2018

У меня есть база данных, полная историй, и каждая история принадлежит пользователю.

У меня уже есть атрибут user_id для каждой истории.

Я недавно добавил атрибут user_name ко всем своимтакже и истории.

Теперь все эти атрибуты user_name имеют значение nil.

В консоли я могу сделать Story.first.user_name = Story.first.user.name, чтобы установить для атрибута user_name значение user.name первой истории.

Как я могу перебрать все мои истории в моей базе данных Postgresql и динамически обновлять значение user_name каждой истории?

Я хочу использовать что-то вроде метода update_all ActiveRecord, но с динамическим аргументом.

Я попытался в консоли 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

Не знаете, как использовать FROM в сыром SQL или как написать правильную команду в ActiveRecord.

1 Ответ

0 голосов
/ 21 октября 2018

Самый простой способ - это перебрать все записи в таблице историй:

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