Скажем, у меня есть класс вроде:
class Basket < ActiveRecord::Base
has_many :fruits
Где «фрукты» - это базовый класс 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 еще не существует).
Я совершенно озадачен. У кого-нибудь есть идеи?