使用数组插入更新属性

时间:2014-01-07 00:55:31

标签: ruby-on-rails ruby arrays attributes ruby-on-rails-4

我有一个Impression模型,其actions属性已为Array序列化。

class Impression < ActiveRecord::Base
  serialize :actions, Array
end

正常属性更新程序:
impression.update(some_attr: "new_value")

正常阵列插入程序:
impression.actions << "new_value"
impression.save

有没有办法在类似.update方法的数组属性中插入一个新值,即在一个表达式中?

1 个答案:

答案 0 :(得分:1)

不,这在使用ActiveRecord序列化功能时是不可能的,因为序列化/反序列化必须由ActiveRecord控制,并且update对数据库执行直接SQL更新调用。

某些非关系型数据库(例如MongoDB)提供此功能,因为它们的设计是为了这样做。 PostgreSQL提供了一个可以安装的Hash扩展,允许您在序列化字段上执行直接操作。

在所有其他情况下,您可以直接更新字段,但我不鼓励您这样做。写入损坏的数据存在潜在风险。

相反,我建议您创建一个执行推送和保存的自定义方法。在任何情况下,这都是一个好主意,因为您在模型外部公开自定义API,而不是将模型耦合到ActiveRecord体系结构。

class Impression < ActiveRecord::Base
  serialize :actions, Array

  def add_action(action)
    self.actions << action
    self.save
  end
end

你可以使用

impression = ...
impression.add_action "new_value"