Frage

Ich habe die folgenden Klassen:

  • Projekt
  • Person
  • Person > Entwickler
  • Person > -Manager

Im Project Modell habe ich die folgenden Anweisungen hinzugefügt:

has_and_belongs_to_many :people
accepts_nested_attributes_for :people

und dem Verlauf der entsprechenden Aussagen in der Klasse Person. Wie kann ich eine Developer zu einem Project durch die nested_attributes Methode hinzufügen? Die folgende funktioniert nicht:

@p.people_attributes = [{:name => "Epic Beard Man", :type => "Developer"}]
@p.people
=> [#<Person id: nil, name: "Epic Beard Man", type: nil>]

Wie Sie die type sehen können Attribute gesetzt ist nil statt "Developer".

War es hilfreich?

Lösung

stieß ich auf ein ähnliches Problem vor ein paar Tagen. Die Vererbungssäule (d.h. type) in einem STI-Modell ist ein geschütztes Attribut. Gehen Sie wie folgt den Standardschutz in Ihrer Person Klasse außer Kraft zu setzen.

Rails 2.3

class Person < ActiveRecord::Base

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

Rails 3

Lesen Sie die Lösung von @ tokland .

Caveat:

Sie überschreiben das System geschützt Attribut.

Hinweis:

SO Frage zum Thema

Andere Tipps

Lösung für Rails3 : attributes_protected_by_default jetzt eine Klasse-Methode:

class Person < ActiveRecord::Base

  private

  def self.attributes_protected_by_default
    super - [inheritance_column]
  end
end

Patches oben nicht für mich arbeiten, aber das tat (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') Klasse == Baz

Für die von uns mit Mongoid, müssen Sie das Feld _type zugänglich machen:

class Person
  include Mongoid::Document
  attr_accessible :_type
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top