假设我有一个像这样的课程:
class Basket < ActiveRecord::Base
has_many :fruits
其中“fruits”是 STI 基类,具有“apples”、“oranges”等子类......
我希望能够在 Basket 中有一个 setter 方法,例如:
def fruits=(params)
unless params.nil?
params.each_pair do |fruit_type, fruit_data|
fruit_type.build(fruit_data)
end
end
end
但是,显然,我得到了一个例外,例如:
NoMethodError (undefined method `build' for "apples":String)
我想到的解决方法是这样的:
def fruits=(params)
unless params.nil?
params.each_pair do |fruit_type, fruit_data|
"#{fruit_type}".create(fruit_data.merge({:basket_id => self.id}))
end
end
end
但这会导致 Fruit STI 对象在 Basket 类之前被实例化,因此 basket_id 键永远不会保存在 Fruit 子类中(因为 basket_id 尚不存在)。
我完全被难住了。有人有想法么?