2015-02-06 53 views
2

我有一个模型代理belongs_to情景。这两个模型都有字段options,我想合并存储在ScenariooptionsAgentoptions中的值,以便我可以执行@agent.options并从AgentScenario中检索值。Rails添加到飞行模型

我想:

# in agent.rb 
def options 
    scenario.options.merge(self.options) 
end 

但是,这将引发Stack too deep错误。

任何建议将不胜感激。谢谢!

回答

4

Brennan已经解释过您的options方法会自动地调用自己导致错误的原因是Stack to deep

还有另一种(更低级别的)方法来读取活动记录模型的属性:read_attribute。使用该方法,您可以编写:

def options 
    read_attribute(:options).merge(scenario.options) 
end 

此方法正好存在于此用例中。阅读更多关于overwriting default accessors in the docs

+0

谢谢,这是诀窍! – Adam 2015-02-06 21:55:50

2

因为Agent有场命名为options,呼吁从类中self.options当你打电话,而不是检索领域的方式方法。当您尝试与self.options合并时,您将无限递归。重命名该方法。

+1

感谢您的回复。我已经将该方法命名为与该字段相同,希望能够覆盖对“@ agent.options”的调用,以便我可以保留对“@ agent.options”的现有引用。是否有一种很好的方式来即时合并两个选项哈希值,所以我仍然可以调用'options'但是同时获得?我认为最好的方法可能是在'after_initialize'回调中合并两者。 – Adam 2015-02-06 21:37:18