如何在不重复自己的情况下在多个字段上执行回调?

时间:2011-03-08 22:32:23

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

我有以下的before_save回调:

  def clear_unused_parents
    if self.parent_type == 'global'
      self.sport_id = nil
      self.school_id = nil
      self.team_id = nil
    elsif self.parent_type == 'sport'
      self.school_id = nil
      self.team_id = nil
    elsif self.parent_type == 'school'
      self.sport_id = nil
      self.team_id = nil
    elsif self.parent_type == 'team'
      self.sport_id = nil      
      self.school_id = nil
    end
  end

基本上,我有一个广告模型,可以是全球性的,也可以属于体育,学校或团队。上面的代码用于在除相应字段之外的所有字段上将id字段设置为NULL。如何在不重复自己的情况下写出同样的东西?

我想写这样的东西,但我不确定该怎么做。

  def clear_unused_parents
    parent_type = self.parent_type
    parent_fields = ['sport_id', 'school_id', 'team_id']
    parent_fields.each do |parent_field|
      unless parent_field == parent_type
        parent_field = nil
      end
    end
  end

3 个答案:

答案 0 :(得分:2)

您应该可以使用send方法执行此操作(调用MyClass.send('foo', args)基本上等同于调用MyClass.foo(args)):

TYPES = ['global', 'sport', 'school', 'team']

def clear_unused_parents
    TYPES.each do |attr|
        self.send("#{attr}_id=", nil) if attr != self.parent_type
    end
end

希望有所帮助!

PS:根据您的示例判断,可能有更好的方法来执行此操作。看看Polymorphic Associations - 我自己从来都不是一个狂热的粉丝,但它们可能就是你想要的......

答案 1 :(得分:1)

认为你在寻找

write_attribute(parent_field,nil)

答案 2 :(得分:1)

如果不进行测试,我认为您应该能够做到这样的事情:

def clear_unused_parents
        parent_type = self.parent_type
        parent_fields = ['sport_id', 'school_id', 'team_id']
        parent_fields.each do |parent_field|
          unless parent_field == parent_type + "_id"
            write_attribute(parent_field.to_sym, nil)
          end
        end
      end