Обновление массива в столбце ActiveRecord не сохраняется - PullRequest
0 голосов
/ 05 мая 2018

У меня есть база данных Postgres. Один из столбцов в одной из моих таблиц состоит из массивов. Это называется aliases. Я пытаюсь объединить два экземпляра, но когда я пытаюсь объединить массивы, они не сохраняются.

irb(main):001:0> original
=> #<Thing id: 1, name: "Foo", aliases: ["Foo"]>
irb(main):002:0> duplicate
=> #<Thing id: 2, name: "Bar", aliases: ["Bar"]>
irb(main):003:0> original.aliases | duplicate.aliases
=> ["Foo", "Bar"]
irb(main):004:0> original.save!                      
(0.3ms)  BEGIN
Thing Exists (0.8ms)  SELECT  1 AS one FROM "thing" WHERE "things"."name" = $1 AND ("thing"."id" != $2) LIMIT $3  [["name", "Foo"], ["id", 1], ["LIMIT", 1]]
(0.3ms)  COMMIT
Thing Store (6.1ms)  {"id":1}
=> true

Но тогда, когда я проверяю original, псевдонимы не слились.

irb(main):005:0> original
=> #<Thing id: 1, name: "Foo", aliases: ["Foo"]>

Я пробовал несколько разных способов вставить duplicate.aliases в original.aliases, но, похоже, ничего не экономит. Есть идеи почему? Я что-то упустил?

Edit: Я на Rails 5.1.4 и Ruby 2.5.0p0

1 Ответ

0 голосов
/ 05 мая 2018

Вы на Rails 3? Я заметил, что обработка массива Rails3 activerecord не любит встроенные обновления. Вам необходимо использовать временную переменную, дополнить эту переменную и затем присвоить ее обратно.

aliases = original.aliases # make a temp variable
aliases = aliases | duplicate.aliases # modify temp variable
original.aliases = aliases # assign back
original.save! # now you can save

Я столкнулся с этим сам, когда пытался вставить массив:

original.aliases << "something" # aliases would never get changed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...