Rails принадлежит_у has_many с пользовательским внешним ключом - программирование
Подтвердить что ты не робот

Rails принадлежит_у has_many с пользовательским внешним ключом

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

Ответ 1

Я решил проблему, это было вопрос добавления 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

Ответ 2

Если таблица PlayerSession имеет столбец с именем alias, то ваш внешний ключ также должен быть alias, а не player_alias. В качестве одного из советов я бы с осторожностью использовал псевдоним в качестве foreign_key: если ваш игрок может/решил изменить свой псевдоним, тогда все записи PlayerSession в вашей базе данных станут недействительными и потребуют обновления. Использование неизменяемого параметра, такого как player_id, предпочтительнее использовать существующий столбец псевдонимов IMHO.