Ho una relazione tra 2 modelli nella mia applicazione di rotaie. Mi sono allontanato dallo standard di come implementare la relazione poiché ho utilizzato un altro campo come chiave primaria e la convenzione di denominazione è diversa. In questo modo la relazione sembrava non essere stabilita. Voglio capire perché.Rails appartiene a has_many con una chiave esterna personalizzata
Questa è una versione tagliata verso il basso dei miei modelli:
class Player < ActiveRecord::Base
set_primary_key "alias"
attr_accessible :alias, :avatar
has_many :player_sessions, :foreign_key => "player_alias", :class_name => "PlayerSession"
end
class PlayerSession < ActiveRecord::Base
attr_accessible :player_alias, :total_score
belongs_to :player, :foreign_key => "player_alias", :class_name => "Player"
end
Il modello Player
ha il campo alias
, che è il nome utente nella mia applicazione. Volevo che il nome utente fungesse da chiave primaria poiché è univoco e sarebbe più semplice migrare i dati e mantenere le relazioni.
Originariamente avevo solo il modello PlayerSession con dati già compilati, ma con l'aumento della mia applicazione ho aggiunto il modello Player e semplicemente inserito una riga con lo stesso alias
.
In show
vista s' il Player
Ho il seguente codice:
Player Sessions:
<% @player.player_sessions do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
Quando provo ad accedere alla pagina che semplice non mostra le informazioni.
Altre informazioni Posso aggiungere è che non ho aggiunto alcuna relazione nel database stesso.
Sono ancora nuovo nei binari e continuo a giocarci. Tutte le opinioni che riguardano gli standard di codifica (al di fuori di rispondere alla domanda) sono benvenute.
Aggiornamento Ho implementato il suggerimento di Babur Usenakunov aggiungendo l'opzione primary_key
nei modelli:
class Player < ActiveRecord::Base
set_primary_key "alias"
attr_accessible :alias, :avatar
has_many :player_sessions, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "PlayerSession"
end
class PlayerSession < ActiveRecord::Base
attr_accessible :player_alias, :total_score
belongs_to :player, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "Player"
end
anche per testare la i dati sono validi ho acquisito la lista PlayerSession manualmente:
Codice implementato nel controller:
@player_sessions = PlayerSession.where("player_alias = ?", params[:id])
.210
codice implementato in vista (che emette i dati):
<% @player_sessions.each do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
<% end %>
Non sono sicuro ma forse dovresti passare anche la chiave primaria nelle opzioni. Per esempio. 'has_many: player_sessions,: primary_key => 'alias',: foreign_key => 'player_alias': class_name => 'PlayerSession'' e' belongs_to: player,: primary_key =>' alias ',: foreign_key => "player_alias", : class_name => "Player" ' –
Provato in questo modo ma ancora non funziona – Drahcir
@Drahcir, sono propenso a pensare che il suggerimento di Babur Usenakunov avrebbe dovuto funzionare. Cosa restituisce '@ player.player_sessions' dopo aver provato il loro suggerimento? – Sun