3

我一直在尝试构建我的应用程序的不同方式,尤其是基于 ActiveRecord 的模型,研究将结果保存为单个字段的单独类的概念。现在组合可能已经奏效,但是关于它是否保留的讨论很多,所以我想知道你可能有什么替代方案。

例子:

class Gadget < ActiveRecord::Base

  attr_accessor: lights

end

现在,我希望该lights属性由一个完全独立的类“管理”:

class Lights

  def doSomething
  end

  def doSomethingElse
  end 

end

例如,为了透明地存储结果,将这个逻辑代理或委托出ActiveRecord模型并进入类的好方法是什么?Lights

例如,使用Lights类的实例作为lights属性——但这不起作用,因为没有关联,对吧?

例如method_missing,用于将所有请求推送到lights实例——但这也不起作用,因为它不会被持久化到数据库中。

也许这是不可能的,但我对保持逻辑运算结果的方法很感兴趣。欢迎所有建议。

4

1 回答 1

4

怎么样的东西:

class Gadget < ActiveRecord::Base

  def lights
    @lights ||= Lights.new(self)
  end

end

class Lights
  attr_reader :root
  delegate :save, :save!, to: :root

  def initialize(root)
    @root = root
  end

  def doSomething
  end

  def doSomethingElse
  end

  def method_missing(method_name, *args, &block)
    #delegate all setters to root
    if method_name =~ /.*=$/
      root.send(method_name, *args, &block)
    else
      super
    end
  end
end

因此你可以这样做:

gadget = Gadget.new
#say gagdet has a name column
gadget.lights.name = 'foo'
gadget.lights.save
gadget.name #=> 'foo'

仍然不确定为什么需要它,但它应该可以工作

于 2013-06-11T07:56:54.087 回答