我正在尝试使用同一对象的 after_save 回调中的一些数据更新序列化属性。
由于各种原因(副作用、无限循环),我不希望触发任何回调。实现这一点的典型方法是使用update_column
,但不幸的是,这不适用于序列化属性。
我知道我可以在我的回调上设置条件以避免再次调用它们,但感觉应该有一种 update_attribute 形式,它不会触发回调,但仍然适用于序列化属性。
有什么建议么?
我正在尝试使用同一对象的 after_save 回调中的一些数据更新序列化属性。
由于各种原因(副作用、无限循环),我不希望触发任何回调。实现这一点的典型方法是使用update_column
,但不幸的是,这不适用于序列化属性。
我知道我可以在我的回调上设置条件以避免再次调用它们,但感觉应该有一种 update_attribute 形式,它不会触发回调,但仍然适用于序列化属性。
有什么建议么?
这就是我所做的
serialize :properties, Hash
def update_property(name, value)
self.properties[name] = value
update_column(:properties, properties)
end
下面分享一个示例,如何在不使用回调的情况下更新序列化属性。
假设您有一个火车对象,并且该表中有一个名为“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))
希望这会有所帮助。
您需要在更新列之前对哈希进行编码:
update_column(:properties, self.class.serialized_attributes['properties'].dump(properties))