Können verschachtelte Attribute mit Vererbung in Kombination miteinander verwendet werden?
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"
.
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:
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