我有一个非常复杂的 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_accessorgetter 和 setter 覆盖了 select 返回的内容。
如何在此模型上同时支持虚拟和实际属性?
ps 我已经尝试了多种使用method_missingwith的方法define_method,但一直无法获得任何成功的东西。