5 Stimmen

accepts_nested_attributes_for through join table with attributes on the join

Wie kann ich den accepts_nested_attributes_for-Helper von ActiveRecord in einer has_many :through-Assoziation verwenden, während ich Attribute zur Join-Tabelle hinzufüge?

Nehmen wir zum Beispiel an, ich habe ein Team-Modell:

class Team < ActiveRecord::Base
  role = Role.find_by_name('player')
  has_many  :players,
            :through    => :interactions, 
            :source     => :user, 
            :conditions => ["interactions.role_id = ?", role.id] do
              class_eval do
                define_method("<<") do |r|                                                             
                  Interaction.send(:with_scope, :create => {:role_id => role.id}) { self.concat r }
                end
              end
            end
end

Das Team hat_viele players を通して interactions weil ein Benutzer mehrere Rollen einnehmen kann (Spieler, Manager usw.).

Wie kann ich accepts_nested_attributes_for verwenden und gleichzeitig Attribute zur Join-Tabelle hinzufügen?

Wenn ich einen bestehenden Team-Datensatz habe team und einen bestehenden Benutzerdatensatz user kann ich so etwas tun:

team.players << user
team.players.size 
=> 1

Aber wenn ich ein neues Team mit einem verschachtelten Spieler erstelle:

team = Team.create(:name => "New York Lions", 
                   :players_attributes => [{:name => 'John Doe'}])
team.players.size
=> 0

In diesem letzten Beispiel werden die Team-, Benutzer- und Interaktionsdatensätze erstellt (und das Team hat den Benutzer durch Interaktionen), aber das Attribut interactions.role_id ist hier nicht gesetzt.

2voto

james2m Punkte 1522
class Team < ActiveRecord::Base
  accepts_nested_attributes_for :interactions

class Interaction < ActiveRecord::Base
  accepts_nested_attributes_for :players

team = Team.create(:name => "New York Lions", :interactions_attribues => [{
                   :players_attributes => [{:name => 'John Doe'}]}])

Ich habe die Erstellung nicht überprüft, so kann die Arrays und Hashes ein wenig durcheinander haben, aber Sie bekommen die Idee. Sie benötigen sowohl die accepts_nested_attributes auf das Team und die Interaktion Modelle.

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