在Rails中更新没有回调的序列化属性

时间:2012-10-09 22:22:15

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

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

有什么建议吗?

3 个答案:

答案 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))