从模型中提取逻辑并将结果持久保存到数据库有什么好的模式?

时间:2013-06-11 07:44:09

标签: ruby-on-rails ruby

我一直在试验构建我的应用程序的不同方法,特别是基于ActiveRecord的模型,研究了一个单独的类,其结果被保存为单个字段的概念。现在组合可能有用了,但是关于它是否保留还有很多讨论,所以我想知道你可能有什么替代品。

示例:

class Gadget < ActiveRecord::Base

  attr_accessor: lights

end

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

class Lights

  def doSomething
  end

  def doSomethingElse
  end 

end

将这个逻辑从ActiveRecord模型中代理或委托给Lights类以透明地存储结果有什么好方法?

e.g。使用Lights类的实例作为lights属性 - 但这不起作用,因为没有关联,对吧?

e.g。使用method_missing将所有请求推送到lights实例 - 但这也不起作用,因为它不会持久保存到数据库。

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

1 个答案:

答案 0 :(得分: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'

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