我有以下的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
答案 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