我有一个非常复杂的 Rails (v 3.2) 模型,它正在对多个表进行手动选择。这对于获取显示模型所需的所有数据非常有用。但是,当我的数据不存在并且我必须创建一个虚拟对象时,这些列在我的模型中不存在。在我的一生中,我想不出一种方法来支持模型上的虚拟列和实际列。
它比这复杂得多,但这是我目前拥有的一般选择:
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
getter 和 setter 覆盖了 select 返回的内容。
如何在此模型上同时支持虚拟和实际属性?
ps 我已经尝试了多种使用method_missing
with的方法define_method
,但一直无法获得任何成功的东西。