我有一个名为header的rails模型,它有一堆项目。标题和项目都有一个名为is_enabled的属性,当标题的is_enabled设置为false时,我们想要更新项目。我目前有这个,但感觉它应该只是一个单行。我怎么能缩短它?
after_save :update_menu_items
def update_items
if self.is_enabled_changed?
self.items.each do |item|
if self.is_enabled==true
item.is_enabled=true
else
item.is_enabled=false
end
item.save!
end
end
end
答案 0 :(得分:1)
您希望项目的is_enabled
属性与父标题的属性匹配。在这种情况下,self.is_enabled
检查是不必要的。
def update_items
self.items.each{|i| i.update_attributes(is_enabled: self.is_enabled) } if self.is_enabled_changed?
end
在这种情况下,#update_attributes
会在每个子项更新时触发保存。
根据调用方法的方式和频率,以及关联的子项数以及该方法的成本,您甚至可能不想检查启用的属性是否正在更改:
def update_items
self.items.each{|i| i.update_attributes(is_enabled: self.is_enabled) }
end
答案 1 :(得分:1)
未经测试,你可以使用update_all方法 - 它没有调用save,因为它没有实例化对象,你需要它来调用save吗?
after_save :update_menu_items
def update_items
self.items.update_all(is_enabled: self.is_enabled) if self.is_enabled_changed?
end