加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 将ActiveRecord与DelegateClass一起使用

发布时间:2020-12-17 02:03:18 所属栏目:百科 来源:网络整理
导读:使用rails 3.2.8我有一个带有几个属性的模型设置 class MyModel ActiveRecord::Base attr_accessible :foo,:barend 我有另一个类设置使用上面作为委托类 class MyModelPresenter DelegateClass(MyModel) def initialize(month,obj) @month = month super(obj
使用rails 3.2.8我有一个带有几个属性的模型设置

class MyModel < ActiveRecord::Base
  attr_accessible :foo,:bar
end

我有另一个类设置使用上面作为委托类

class MyModelPresenter < DelegateClass(MyModel)
  def initialize(month,obj)
    @month = month
    super(obj)
  end

  def self.build(month,attributes = { })
    new(month,MyModel.new).tap do |p|
      p.attributes = attributes
    end
  end

  def attributes=(attributes)
    attributes.each { |k,v| send("#{k}=",v) }
  end
end

当我创建一个新的MyModelPresenter时,如下所示:

MyModelPresenter.build(Date.today,{:foo => 1})

我得到了以下回复

NoMethodError: undefined method `foo=' for #<MyModel:0x1098f31a8>
    from /Users/me/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/activemodel-3.2.8/lib/active_model/attribute_methods.rb:404:in `method_missing'
    from /Users/me/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/attribute_methods.rb:149:in `method_missing'
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `send'
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `attributes='
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `each'
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:23:in `attributes='
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:17:in `build'
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:15:in `tap'
    from /Users/me/dev/temp/app/presenters/my_model_presenter.rb:15:in `build'

由于某种原因,未定义模型上的数据库属性(setter或getter).在升级到rails 3.2之前,这一切都在rails 3.1应用程序中运行.

有没有人知道为什么没有定义模型的属性方法?

解决方法

从Delegator继承而不是使用DelegateClass解决了这个问题.这是最后一堂课的样子:

class MyModelPresenter < Delegator
  def initialize(month,obj)
    @month = month
    super(obj)
    @_sd_obj = obj
  end

  def __getobj__
    @_sd_obj
  end

  def self.build(month,v) }
  end
end

如您所见,我还必须添加def __getobj__方法.并将初始化程序中的@_sd_obj设置为我委托的类的实例.

请参见SimpleDelegator示例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读