【问题标题】:Rails add to model on the flyRails 即时添加到模型中
【发布时间】:2015-02-06 21:13:03
【问题描述】:

我有一个模型代理 belongs_to 场景。两个模型都有options字段,我想将Scenariooptions中存储的值与Agentoptions合并,这样我就可以做@agent.options并从Agent和@检索值987654329@.

我试过了:

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

但这会引发Stack too deep 错误。

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord activemodel


    【解决方案1】:

    Brennan 已经解释过,您的 options 方法会递归调用自身,这会导致 Stack to deep 错误。

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

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

    此方法正是针对此用例而存在的。阅读有关overwriting default accessors in the docs 的更多信息。

    【讨论】:

      【解决方案2】:

      因为Agent 有一个名为options 的字段 方法,当从类中调用self.options 时,您调用该方法而不是检索该字段。当您尝试与self.options 合并时,您将无限递归。重命名方法。

      【讨论】:

      • 感谢您的回复。我将方法命名为与字段相同的名称,希望可以覆盖对@agent.options 的调用,以便保留对@agent.options 的现有引用。有没有一种好方法可以即时合并两个选项哈希,这样我仍然可以调用options,但同时获得两者?我认为最好的方法可能是将两者合并到 after_initialize 回调中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多