2015-04-10 10 views
20

Ho bisogno di fare due associazioni nello stesso modello. Dove:Come fare has_many e has_one nello stesso modello?

squadrahas_manyutente Ora, voglio che squadrahas_oneleader

Questa "Leader" sarà un utente

Im cercando di utilizzare has_one throught ma penso quell'associazione non è lavoro.

Leader.rb

class Leader < ActiveRecord::Base 
belongs_to :user 
belongs_to :team 

Team.rb

class Team < ActiveRecord::Base 
has_one :user, through: :leader 
end 

User.rb

class User < ActiveRecord::Base 

belongs_to :team 
has_one :captain 

end 

e ottenere seguente errore attorno alla riga 27:

NoMethodError in TeamsController#create 

26 def create 

**27 @team = current_user.teams.create(team_params)** 

28 @team.save 

29 respond_with(@team) 

30 current_user.update(team_id: @team.id) 
+0

Un utente può essere presente in più team o in una sola squadra? – nathanvda

+0

perché 'current_user' è un utente, non un leader/capitano, perché il tuo metodo funzioni è necessario 'current_user. (Leader/capitano) .teams.create (team_params)', controlla anche le tue associazioni, è leader o è Capitano –

risposta

20

In questo caso credo che avete bisogno di 2 modello sono abbastanza

1). Modello utente

class User < ActiveRecord::Base 
    belongs_to :team 
end 

2). Modello di team

class Team < ActiveRecord::Base 
    has_many :users 
    belongs_to :leader, class_name: 'User', foreign_key: :leader_id 
end 
+0

con questo non ho bisogno della tabella "leader"? –

+0

esattamente, non hai più bisogno della tabella dei leader più –

+0

Ok, ci proverò Grazie –

1

current_user.teams.create(team_params)

squadre è per un'associazione has_many, si vuole current_user.create_team(team_params)

+0

Ciao ... il record non viene salvato nella tabella 'capitani' ... grazie –

0

Hai has_one associazione tra user e team. Prova questo:

current_user.create_team(team_params) 

Inoltre, si dovrebbe aggiungere una corretta indietro associazione team-leader.

class Team < ActiveRecord::Base 
    belongs_to :leader 
    has_one :user, through: :leader 
end 
+0

Ciao ... il record non viene salvato nella tabella 'capitani' ... grazie –

+0

Che cos'è il tavolo 'capitani' ? Non hai specificato questo nella tua domanda. A proposito, questa risposta ti ha aiutato a liberarti del tuo problema originale? – RAJ

+0

Scusa ... i capitani avevano torto ... è il capo. Ho modificato la mia domanda. Non sto ancora salvando = ( –

2

ne dite di impostazione di un flag boolean nella tabella utenti chiamato leader. E poi la vostra associazione può diventare:

class Team < ActiveRecord::Base 
    has_many :users 
    has_one :leader, class_name: 'User', -> { where leader: true } 
end 
2

squadra has_many utente Ora, voglio che il Team has_one leader

Questa "Leader" sarà un utente

utilizzare l'ereditarietà (chiamato anche sottoclasse), Leader è un utente.

class User < ActiveRecord::Base 
    belongs_to :team 
end 

class Leader < User 
end 

class Team < ActiveRecord::Base 
    has_many :users 
    has_one :leader 
end 

Anche la tabella utenti è importante. Assicurati che gli utenti abbiano t.belongs_to :team e t.string :type nel suo metodo create_table.Si noti che un leader è un utente e non ha bisogno di una tabella separata, tuttavia è necessario consentire a ActiveRecord di registrare il suo tipo in modo che possa restituire il modello corretto in un secondo momento.

Riferimenti:

inheritance specificamente è necessario 'ereditarietà delle tabelle singolo'

belongs_to scorrere verso il basso per has_one e has_many, le tre relazioni usate qui.

+0

Penso che questo sia meglio in quanto consente più modifiche in futuro con solo una colonna aggiuntiva (tipo). Con la risposta accettata, la colonna 'leader_id' funziona solo per i leader ... – Pak

Problemi correlati