【问题标题】:Update to array in ActiveRecord column not saving更新 ActiveRecord 列中的数组未保存
【发布时间】:2018-05-04 22:12:20
【问题描述】:

我有一个 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,但似乎没有任何保存。任何想法为什么?我错过了什么吗?

编辑: 我在 Rails 5.1.4 和 Ruby 2.5.0p0

【问题讨论】:

  • a | b 不会修改 a。当您original.aliases = original.aliases | duplicate.aliases; original.save! 时会发生什么?还是original.aliases |= duplicate.aliases
  • @muistooshort 好点。 original.aliases = original.aliases | duplicate.aliases; 在 Rails 控制台中输入时有效,但由于某种原因在工作人员运行时无效。任何想法为什么?
  • 放弃那个。现在似乎工作正常。谢谢@muistooshort。如果您添加为答案,我可以接受。
  • 科迪在他的回答中所说的几乎是一样的,所以我建议接受那个。

标签: ruby-on-rails arrays activerecord


【解决方案1】:

你在 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

【讨论】:

  • 我在 Rails 5 上。我已经更新了问题。不幸的是,您建议的答案也不起作用。 ?
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2012-11-12
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2012-03-16
相关资源
最近更新 更多