我正在尝试使用同一对象上的after_save回调中的某些数据更新序列化属性。
由于各种原因(副作用,无限循环),我不希望触发任何回调。实现此目的的典型方法是使用 update_column
,但不幸的是,这不适用于序列化属性。
我知道我可以在我的回调上放置条件以避免再次调用它们,但是它感觉应该有一种update_attribute形式,它不会触发回调,但仍然可以使用序列化属性。
有什么建议吗?
答案 0 :(得分:1)
这就是我的工作
serialize :properties, Hash
def update_property(name, value)
self.properties[name] = value
update_column(:properties, properties)
end
答案 1 :(得分: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))
希望这会有所帮助。
答案 2 :(得分:0)
您需要在更新列之前对哈希进行编码:
update_column(:properties, self.class.serialized_attributes['properties'].dump(properties))