我有一个Impression
模型,其actions
属性已为Array
序列化。
class Impression < ActiveRecord::Base
serialize :actions, Array
end
正常属性更新程序:
impression.update(some_attr: "new_value")
正常阵列插入程序:
impression.actions << "new_value"
impression.save
有没有办法在类似.update
方法的数组属性中插入一个新值,即在一个表达式中?
答案 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"