Можно ли использовать вложенные атрибуты в сочетании с наследованием? - PullRequest
7 голосов
/ 31 марта 2010

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

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

В модель Project я добавил следующие утверждения:

has_and_belongs_to_many :people
accepts_nested_attributes_for :people

И, конечно, соответствующие утверждения в классе Person. Как я могу добавить Developer к 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".

Ответы [ 4 ]

7 голосов
/ 04 июля 2012

Решение для Rails3 : attribute_protected_by_default в настоящее время метод класса:

class Person < ActiveRecord::Base

  private

  def self.attributes_protected_by_default
    super - [inheritance_column]
  end
end
5 голосов
/ 31 марта 2010

Я столкнулся с подобной проблемой несколько дней назад. Столбец наследования (т. Е. type) в модели STI является защищенным атрибутом. Выполните следующие действия, чтобы переопределить защиту по умолчанию в вашем классе Person.

Рельсы 2.3

class Person < ActiveRecord::Base

private
  def attributes_protected_by_default
    super - [self.class.inheritance_column]
  end
end

Рельсы 3

См. Решение , предложенное @tokland.

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

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

Справка:

ТАК Вопрос по теме

4 голосов
/ 04 июня 2010

Патчи выше не работали для меня, но это работало (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

0 голосов
/ 29 июня 2013

Для тех из нас, кто использует Mongoid, вам нужно сделать доступным поле _type:

class Person
  include Mongoid::Document
  attr_accessible :_type
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...