7 Stimmen

Können verschachtelte Attribute in Kombination mit Vererbung verwendet werden?

Ich habe die folgenden Klassen:

  • Project
  • Person
  • Person > Developer
  • Person > Manager

In dem Project Modell habe ich folgende Anweisungen hinzugefügt:

has_and_belongs_to_many :people
accepts_nested_attributes_for :people

Und natürlich die entsprechenden Anweisungen in der Klasse Person. Wie kann ich einen Developer zu einem Project durch die nested_attributes Methode hinzufügen? Das folgende funktioniert nicht:

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

Wie Sie sehen können, wird das type Attribut auf nil anstelle von "Developer" gesetzt.

7voto

tokland Punkte 63238

Lösung für Rails3: attributes_protected_by_default ist jetzt eine Klassenmethode:

class Person < ActiveRecord::Base

  private

  def self.attributes_protected_by_default
    super - [inheritance_column]
  end
end

5voto

Harish Shetty Punkte 63187

Ich bin vor ein paar Tagen auf ein ähnliches Problem gestoßen. Die Vererbungsspalte (d.h. type) in einem STI-Modell ist ein geschütztes Attribut. Tun Sie das Folgende, um den standardmäßigen Schutz in Ihrer Klasse Person 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

Verweisen Sie auf die Lösung, die von @tokland vorgeschlagen wurde.

Vorsicht:

Sie überschreiben das systemgeschützte Attribut.

Referenz:

SO-Frage zum Thema

4voto

grosser Punkte 14107

Patches darüber haben für mich nicht funktioniert, aber das hat (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

0voto

Andrew Punkte 210206

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

class Person
  include Mongoid::Document
  attr_accessible :_type
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X