私のレールアプリケーションで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 %>
私は、おそらくオプションでプライマリキーを渡す必要があります。例えば。 'player_sessions'、:primary_key => 'エイリアス'、:foreign_key => 'player_alias':class_name => 'PlayerSession''および' belongs_to:player、:primary_key => 'エイリアス'、:foreign_key => 'player_alias' :class_name => "Player" ' –
そのようにしてもまだ動作しない – Drahcir
@Drahcir、私はBabur Usenakunovの提案がうまくいかなければならないと思っています。 '@ player.player_sessions'はあなたの提案を試した後に何を返しますか? – Sun