私が次のようなクラスを持っているとしましょう:
class Basket < ActiveRecord::Base
has_many :fruits
ここで、「fruits」は、「apples」、「oranges」などのサブクラスを持つSTI基本クラスです。
次のようなバスケットでセッターメソッドを使用できるようにしたいと思います。
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がまだ存在しないため)。
私は完全に困惑しています。誰かアイデアはありますか?