我一直在试验构建我的应用程序的不同方法,特别是基于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
实例 - 但这也不起作用,因为它不会持久保存到数据库。
也许这是不可能的,但我对如何坚持逻辑运算的结果感兴趣。欢迎所有建议。
答案 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'
仍然不确定为什么你需要它,但它应该工作