2015-03-26 10 views
8

Ich habe gelernt, Schienen und ich habe ein Problem mit Beziehungen gestolpert. Ich habe viele-zu-viele Assoziationen User-Tournament, und aus irgendeinem Grund kann ich nicht auf beteiligte_Turniere auf User-Instanzen zugreifen oder kann nicht auf Teilnehmer in Turnier-Instanzen zugreifen.Schienen, has_many: durch undefined Methode `to_sym` für nil: NilClass

2.0.0-p643 :001 > Tournament.new.participants 
NoMethodError: undefined method `to_sym' for nil:NilClass 
from /home/marcin/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.1.8/lib/active_record/reflection.rb:100:in `_reflect_on_association' 
from /home/marcin/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.1.8/lib/active_record/reflection.rb:537:in `source_reflection' 

User-Modell

class User < ActiveRecord::Base 
    has_many :participants_tournaments 
    has_many :participated_tournaments, :through => :participants_tournaments 
end 

Turnier Modell

class Tournament < ActiveRecord::Base 
    has_many :participants_tournaments 
    has_many :participants, :through => :participants_tournaments 
end 

ParticipantsTournament Modell

class ParticipantsTournament < ActiveRecord::Base 
    belongs_to :tournament 
    belongs_to :user 
end 

ParticipantsTournament Migration

def change 
    create_table :participants_tournaments, :id => false do |t| 
    t.integer "tournament_id", 
    t.integer "user_id" 
    end 
end 

ich gelesen habe: This topic on SO, also this topic und beobachtete/Lese this railscast, aber ich kann nicht endlich scheinen, um es zu arbeiten.

+0

Können Sie 't = Tournament.new' gefolgt von' t.participants' versuchen? – sixty4bit

+0

mit has_many: through Ich bin mir ziemlich sicher, dass die Join-Tabelle eine ID-Spalte für Primärschlüssel benötigt. Wenn Sie also diese Tabelle erstellen, müssen Sie ': id => false 'in der Migration löschen. – maxhungry

+0

@MaxHung Sie benötigen keine ID in einer Join-Tabelle. Sie brauchen nur IDs für die Dinge, die Sie beitreten. – Austio

Antwort

19

Wenn Sie .new auf Turnieren aufrufen, hat es keine id, so wird es nil sein. Daher wird der Benutzer nicht gefunden.

Auch wenn Sie ein Modell in einem neu zuordnen, müssen Sie dem aktiven Datensatz mitteilen, wonach das Modell suchen soll. Sie tun dies mit dem Argument :source. So würde das Turnier funktionieren.

class Tournament < ActiveRecord::Base 
    has_many :participants_tournaments 
    has_many :participants, :through => :participants_tournaments, :source => :user 
end 
+0

Danke! Es macht viel Sinn mit: Source-Option, aber wenn ich früher googlen, wurde es nicht viel erwähnt. Vielen Dank! – Marcin

Verwandte Themen