30

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.

のビューには、次のコードがありますPlayershow

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 %>
4

2 に答える 2

26

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
于 2013-06-02T18:33:41.130 に答える