Rails 4使用父属性覆盖模型属性

时间:2015-03-26 12:23:29

标签: ruby-on-rails

在Rails 4中实现以下目标的最佳方法是什么?父子模型具有相同的属性。如果子模型没有设置所述属性,那么它继承父项,否则,它会呈现自己的值。

我尝试在子方法中创建一个与model属性同名的方法来执行逻辑,但这会导致堆栈级别太深的错误。

  def age_of_seniority
    age_of_seniority.present? ? age_of_seniority : borough.age_of_seniority
  end

更新

我不想更改方法名称,我希望能够将其作为普通属性访问

3 个答案:

答案 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做了什么。