我的rails应用程序中有两个模型之间的关系.我已经偏离了如何实现关系的标准,因为我使用另一个字段作为主键,命名约定是不同的.这样做导致这种关系似乎没有建立起来.我想了解为什么.
这是我的模型的精简版:
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
Run Code Online (Sandbox Code Playgroud)
该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>
Run Code Online (Sandbox Code Playgroud)
当我尝试访问页面时,它很简单,不显示信息.
我可以添加的其他信息是我没有在数据库本身中添加任何关系.
我还是铁杆新手,还在玩它.任何涉及编码标准的意见(在回答问题之外)都是受欢迎的.
更新我通过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
Run Code Online (Sandbox Code Playgroud)
另外,为了测试数据是否有效,我手动获取了PlayerSession列表:
控制器中实现的代码:
@player_sessions = PlayerSession.where("player_alias = ?", params[:id])
Run Code Online (Sandbox Code Playgroud)
在视图中实现的代码(输出数据):
<% @player_sessions.each do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)
Dra*_*cir 16
我已经解决了这个问题,这是each我在视图中实现的循环中添加的问题:
<% @player.player_sessions.each do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)
玩了一下之后,我意识到我不需要在任何一个视图中添加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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32395 次 |
| 最近记录: |