2013-06-01 15 views
16

私のレールアプリケーションで2つのモデルの関係があります。私は主キーとして別のフィールドを使用し、命名規則が異なるので、関係を実装する方法の標準から遠ざかってしまった。そうすることで、関係は一見確立されていないようになった。私は理由について理解したい。 Playerモデルは私のアプリケーションでは、ユーザー名のフィールドaliasを持ってrails belongs_to has_manyカスタム外部キーを使用

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 

これは私のモデルのトリムダウンバージョンです。私はユニークなので、ユーザー名をプライマリキーとして動作させたいと思っていました。データを移行して関係を維持する方が簡単です。

元々、私はデータがすでに入っているPlayerSessionモデルしか持っていませんでしたが、アプリケーションが増えてPlayerモデルが追加され、同じaliasの行が挿入されました。 Playerさんshowビューで

私は、次のコードを持っている:私はそれが簡単な情報が表示されないページにアクセスしようとすると

Player Sessions: 
<% @player.player_sessions do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul> 

を。

私が追加できるその他の情報は、データベース自体に関係を追加していないことです。

私はまだレールを初めて使っていて、まだそれを使って遊んでいます。コーディング基準に関係する意見(質問に答える以外の)は歓迎です。


更新私はモデルでprimary_keyオプションを追加することにより、バーブルUsenakunovの提案を実装している:

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 

またテストするデータが有効である私は、手動でPlayerSessionリストを取得:

コントローラに実装されたコード:

@player_sessions = PlayerSession.where("player_alias = ?", params[:id]) 

コード(データを出力する)ビューで実装:

<% @player_sessions.each do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul> 
<% end %> 
+1

私は、おそらくオプションでプライマリキーを渡す必要があります。例えば。 'player_sessions'、:primary_key => 'エイリアス'、:foreign_key => 'player_alias':class_name => 'PlayerSession''および' belongs_to:player、:primary_key => 'エイリアス'、:foreign_key => 'player_alias' :class_name => "Player" ' –

+0

そのようにしてもまだ動作しない – Drahcir

+0

@Drahcir、私はBabur Usenakunovの提案がうまくいかなければならないと思っています。 '@ player.player_sessions'はあなたの提案を試した後に何を返しますか? – Sun

答えて

1

をごPlayerSessionテーブルがaliasという名前の列がある場合は、お使いの外部キーもalias、ないplayer_aliasでなければなりません。アドバイスのトークンとして、エイリアスをforeign_keyとして使用することには注意が必要です。プレイヤーがエイリアスを変更できる場合、データベース内のすべてのPlayerSessionレコードは無効になり、更新が必要になります。既存のエイリアス列IMHOを使用するよりも、player_idのような不変パラメータを使用する方が適しています。

+0

エイリアスはプレーヤーのユーザー名です。それは変更できません。それはあなたの電子メールアドレスを変更し、すべてのあなたの電子メールを維持することを決定するのと同じです – Drahcir

12

私はそれは私がビューで実装ループでeachを追加するだけだった、問題を解決した:

<% @player.player_sessions.each do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul>  
<% end %> 

ビットの周りにプレイした後、私はPRIMARY_KEYを追加する必要はありませんでした実現オプションを使用し、外部キーオプションはPlayerモデルでのみ残しました。

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, :class_name => "Player" 
end 
+0

この1つで私を助けることができますか? http://stackoverflow.com/questions/25047920/rails-belongs-to-with-custom-column-name – mariowise

関連する問題