我怎么能更简洁地写这个

时间:2015-06-04 02:37:46

标签: ruby-on-rails ruby

我有一个名为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

2 个答案:

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