У меня есть отношение между двумя моделями в приложении 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
Модель 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
в модели:
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 %>