Rails アプリケーションで 2 つのモデルの間に関係があります。別のフィールドを主キーとして使用し、命名規則が異なるため、リレーションシップを実装する方法の標準から離れました。そうすることで、関係が確立されていないように見えました。その理由を理解したい。
これは私のモデルの縮小版です:
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
Player
モデルには、アプリケーションのユーザー名であるフィールドがalias
あります。ユーザー名は一意であり、データの移行と関係の維持が容易になるため、ユーザー名を主キーとして機能させたいと考えました。
もともと、データが既に入力されている 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
モデルにオプションを追加して、Babur 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 %>