Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中不使用回调更新序列化属性_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 在Rails中不使用回调更新序列化属性

Ruby on rails 在Rails中不使用回调更新序列化属性,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我试图在同一对象上的after_save回调中使用一些数据更新序列化属性 我不希望由于各种原因(副作用、无限循环)触发任何回调。实现这一点的典型方法是使用update\u column,但不幸的是,这不适用于序列化属性 我知道我可以在回调上设置条件以避免再次调用它们,但我觉得应该有一种形式的update_属性,它不会触发回调,但仍然可以使用序列化属性 有什么建议吗?我就是这么做的 serialize :properties, Hash def update_property(name, val

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

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

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

有什么建议吗?

我就是这么做的

serialize :properties, Hash

def update_property(name, value)
  self.properties[name] = value
  update_column(:properties, properties)
end

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

update_column(:properties, self.class.serialized_attributes['properties'].dump(properties))

下面分享一个示例,说明如何在不回调的情况下更新serialize属性

假设您有一个train对象,该表中有一个名为“running_weekdays”的序列化属性,该属性存储特定train运行的日期

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"}
现在,您可以使用更新_列更新此内容,如下所示:

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

希望这会有所帮助。

以后可能需要重新加载实例