【问题标题】:Overriding initialize method into model in Rails在 Rails 中将初始化方法覆盖到模型中
【发布时间】:2013-08-02 15:11:08
【问题描述】:

我正在尝试覆盖初始化方法。见下文

class Restriction < ActiveRecord::Base
  RESTRICTION_TYPES = {
    less_than: "IND<X", 
    greater_than: "X<IND", 
    between: "X<IND<Y"
  }

  def initialize restriction_type_name
    super
    formula = RESTRICTION_TYPES[restriction_type_name]
  end

  private
  def formula=f
    self[:formula] = f
  end

end

当我运行r = Restriction.new(:between) 时出现异常:

NoMethodError: undefined method `stringify_keys' for :between:Symbol

我做错了什么?

顺便说一句,我这样做是因为 formula 属性无法从外部访问。

【问题讨论】:

  • 真的不是个好主意。 ActiveRecord 在初始化方法的背后做了很多魔术。
  • 我读到过。那么我的问题的最佳解决方案是什么?

标签: ruby-on-rails activerecord ruby-on-rails-4 object-initializers


【解决方案1】:

你不能覆盖initialize,而且你所拥有的无论如何都不会工作(它会尝试在初始化方法中设置一个名为formula的局部变量)。但是,您可以将条件移动到您的 formula= 设置器中,因此它的内容如下:

def formula=(restriction_type_name)
  self[:formula] = RESTRICTION_TYPES[restriction_type_name]
end

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多