Вложенные атрибуты могут использоваться в сочетании с наследованием?

У меня есть следующие классы:

  • Проект
  • Человек
  • Человек> Разработчик
  • Человек> менеджер

В 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".

7
задан JJD 8 February 2013 в 17:49
поделиться

2 ответа

Несколько дней назад я столкнулся с похожей проблемой. Столбец наследования (например, тип ) в модели 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 .

Предупреждение:

Вы переопределяете атрибут защиты системы.

Ссылка:

SO Вопрос по теме

5
ответ дан 6 December 2019 в 12:48
поделиться

Вышеупомянутые патчи у меня не работали, но это помогло (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

4
ответ дан 6 December 2019 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: