Как настроить вид «own_to: through», не устанавливая прямой принадлежностей - PullRequest
33 голосов
/ 20 октября 2011

Я знаю, что "own_to: through" недопустимо, это просто моя попытка выразить то, чего я хочу достичь, просто потерпите меня на секунду ...

Вот что я получил:

class League
  has_many :divisions
end

class Division
  belongs_to :league
  has_many :teams
end

class Team
  belongs_to :division
  has_many :players
end

class Player
  belongs_to :team
end

Теперь, чтобы сделать форму просмотра "бейсбольной карты", мне нужно:

name
team.name
team.division.name
team.division.league.name

Итак, есть ли способ настроить «own_to: through» для прямого доступа к «Division.name» из «Players_controller» без «команды». префикс ?? Мне нужно получить доступ ко многим столбцам от «игрока» до «подразделения», поэтому я ищу способ получить «прямой» доступ к этим столбцам.

Одним из вариантов является включение столбца «Division_id» в таблицу «игроков», но мне сказали, что это в некотором роде нарушит реляционную модель данных, так как это может привести к несогласованности, если функциональность выбора данных не будет правильно обработано (например, игрок A входит в команду A, которая находится в подразделении A, но у игрока A для столбца Division_id установлено значение подразделения B).

Можно ли создать "символическую ссылку", например, «деление» теперь относится к «team.division», а «лига» теперь относится к «team.division.league» ??

Или единственный верный вариант - использовать полный путь каждый раз ??

Надеюсь, кто-то может помочь.

Br, Jonas

Ответы [ 3 ]

62 голосов
/ 15 февраля 2013

Использование делегата в классе модели.

class Team < ActiveRecord::Base
  belongs_to :division
  has_many :players

  delegate :league, to: :division
end

Ссылка: http://api.rubyonrails.org/classes/Module.html#method-i-delegate

8 голосов
/ 23 февраля 2012

Вы можете попробовать

    class Player
      belongs_to :team
      has_one :division, :through => :team
    end
7 голосов
/ 20 октября 2011

Вы можете определить вспомогательный метод в вашей модели игрока:

def division
  team.division
end

def league
  team.division.league
end

Конечно, это относится только к читабельности вашего кода и не влияет на форму запросов к базе данных. Если ваш оператор генерирует несколько SQL-запросов, но вы хотите только один, проверьте параметр .include здесь: Руководства по Rails - интерфейс запросов Active Record

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...