我有一个是做一个手动选择多个表一个非常复杂的Rails(V 3.2)模型。这对于获取显示我的模型所需的所有数据非常有用。但是,当我的数据不存在并且我必须创建一个虚拟对象时,这些列在我的模型中不存在。对于我来说,我无法想出一种方法来支持模型上的虚拟列和实际列。Rails的模型属性
这是一个很多比这更复杂,但是这是一般选择我目前有:
class MyObject < ActiveRecord::Base
attr_accessible :apples, :bananas, :oranges
def self.get(id)
select("my_objects.*, table1.apples, table2.bananas, table3.oranges")
.joins("left outer join table1 on something
left outer join table2 on something
left outer join table2 on something")
.where(:my_object => id)
end
end
这什么我需要它时显示id
存在的伟大工程。但是,在某些情况下,id
不存在,我必须显示一个虚拟(或默认)对象。
我想我可以简单地做这样的事情对于虚拟对象:
@my_object = MyObject.new({:apples => 1,
:bananas => 50,
:oranges => 10})
但当然,在视图中,当我做@my_object.apples
我得到一个错误,因为myObject的实际上不具有这些列:
ActionView::Template::Error (unknown attribute: apples)
下一步我真是加attr_accessor
到MyObject
型号:
attr_accessor :apples, :bananas, :oranges
,对于virtual
版本的MyObject
完美的作品。但是现在,当试图展示真实版本的对象时,我所有的苹果,香蕉和橘子都是零!我认为这是因为attr_accessor
获取者和设置者重写了选择返回的内容。
我怎么能支持这种模式的虚拟和实际属性?
p.s.我已经尝试了多种使用method_missing
以及define_method
的方法,但一直未能取得任何成功。
这可能是因为这是你构建一个例子,但我很困惑,为什么你提到的两个'apple'和'apples' ,“香蕉”和“香蕉”,“杯子”和“桔子”......你希望能够在MyObject实例上调用的实际方法是什么? – carols10cents
@ carolclarinet - 对不起,这是由于我错过了所有更改的编辑。现在已经修复了。核心问题是,有时属性存在,有时他们不会 – lightswitch05
真棒,这清除了很多。谢谢! – carols10cents