在Rails 4中实现以下目标的最佳方法是什么?父子模型具有相同的属性。如果子模型没有设置所述属性,那么它继承父项,否则,它会呈现自己的值。
我尝试在子方法中创建一个与model属性同名的方法来执行逻辑,但这会导致堆栈级别太深的错误。
def age_of_seniority
age_of_seniority.present? ? age_of_seniority : borough.age_of_seniority
end
我不想更改方法名称,我希望能够将其作为普通属性访问
答案 0 :(得分:3)
您可以使用read_attribute
def age_of_seniority
read_attribute(:age_of_seniority) || borough.age_of_seniority
end
答案 1 :(得分:1)
致电超级:
def seniority_age
super || borough.age_of_seniority
end
一个简单的例子:
class Parent
attr_accessor :seniority_age
end
class Child < Parent
def seniority_age
super||'foo'
end
end
c = Child.new
puts c.seniority_age
c.seniority_age = "bar"
puts c.seniority_age
返回:
FOO
巴
答案 2 :(得分:0)
您从方法中递归调用方法,这当然会导致堆栈溢出。
def age_of_seniority
age_of_seniority.present? ? age_of_seniority : borough.age_of_seniority
end
如果age_of_seniority存储在实例变量中,则可以使用以下命令访问它:
@age_of_seniority
所以在你的代码中:
def age_of_seniority
@age_of_seniority.present? ? @age_of_seniority : borough.age_of_seniority
end
要从父级调用覆盖方法,您只需使用super
即可。
不太清楚borough.age_of_seniority
做了什么。