У меня есть следующие классы:
В Project
модель я добавил следующие утверждения:
has_and_belongs_to_many :people
accepts_nested_attributes_for :people
И конечно соответствующие операторы в классе Person
. Как я могу добавить a Developer
к a Project
через nested_attributes
метод? Следующее не работает:
@p.people_attributes = [{:name => "Epic Beard Man", :type => "Developer"}]
@p.people
=> [#<Person id: nil, name: "Epic Beard Man", type: nil>]
Поскольку Вы видите type
атрибуты установлены на nil
вместо "Developer"
.
Несколько дней назад я столкнулся с похожей проблемой. Столбец наследования (например, тип
) в модели STI является защищенным атрибутом. Выполните следующие действия, чтобы переопределить защиту по умолчанию в вашем классе Person
.
Rails 2.3
class Person < ActiveRecord::Base
private
def attributes_protected_by_default
super - [self.class.inheritance_column]
end
end
Rails 3
Обратитесь к решению , предложенному @tokland .
Предупреждение:
Вы переопределяете атрибут защиты системы.
Ссылка:
Вышеупомянутые патчи у меня не работали, но это помогло (Rails3):
class ActiveRecord::Reflection::AssociationReflection
def build_association(*options)
if options.first.is_a?(Hash) and options.first[:type].presence
options.first[:type].to_s.constantize.new(*options)
else
klass.new(*options)
end
end
end
Foo.bars.build (: type => 'Baz'). Class == Baz