5

我正在尝试使用同一对象的 after_save 回调中的一些数据更新序列化属性。

由于各种原因(副作用、无限循环),我不希望触发任何回调。实现这一点的典型方法是使用update_column,但不幸的是,这不适用于序列化属性。

我知道我可以在我的回调上设置条件以避免再次调用它们,但感觉应该有一种 update_attribute 形式,它不会触发回调,但仍然适用于序列化属性。

有什么建议么?

4

3 回答 3

1

这就是我所做的

serialize :properties, Hash

def update_property(name, value)
  self.properties[name] = value
  update_column(:properties, properties)
end
于 2012-10-10T00:01:28.423 回答
1

下面分享一个示例,如何在不使用回调的情况下更新序列化属性。

假设您有一个火车对象,并且该表中有一个名为“running_weekdays”的序列化属性,该属性存储特定火车在哪一天运行。

train = Train.last
train.running_weekdays
=>  {"Mon"=>"true", "Tues"=>"true", "Wedn"=>"true", "Thur"=>"true", "Frid"=>"true", "Sat"=>"true", "Sun"=>"true"}

现在假设您要将除“星期一”之外的所有工作日的值设置为 false

changed_weekdays = {"Mon"=>"true", "Tues"=>"false", "Wedn"=>"false", "Thur"=>"false", "Frid"=>"false", "Sat"=>"false", "Sun"=>"false"}

现在您可以使用 update_column 来更新它,如下所示:

train.update_column(:running_weekdays,  train.class.serialized_attributes['running_weekdays'].dump(changed_weekdays))

希望这会有所帮助。

于 2018-09-15T14:55:35.873 回答
0

您需要在更新列之前对哈希进行编码:

update_column(:properties, self.class.serialized_attributes['properties'].dump(properties))
于 2014-03-12T10:05:49.260 回答