управление несколькими Foreign_key в модели - PullRequest
0 голосов
/ 18 июня 2011

Я изо всех сил пытаюсь построить хорошую схему / ассоциации между моделями в Rails, и надеюсь на несколько советов.У «игрока» есть несколько «отборов», и каждый «отбор» состоит из трех упорядоченных «всадников».

Обобщение схемы:

create_table players do |t|
  t.string "name"
  ...
end

create_table picks do |t|
  t.integer "player_id"
  t.integer "rider1_id"
  t.integer "rider2_id"
  t.integer "rider3_id"
  ...
end

create_table riders do |t|
  t.string "name"
  ...
end

У меня есть некоторые изассоциации между построенными моделями:

player.rb:
class Player < ActiveRecord::Base
  has_many :picks
end

pick.rb:
class Pick < ActiveRecord::Base
  has_many :riders, :foreign_key => "rider1_id"
  has_many :riders, :foreign_key => "rider2_id"
  has_many :riders, :foreign_key => "rider3_id"
  belongs_to :player
end

rider.rb
class Rider < ActiveRecord::Base
  belongs_to :pick
end

Я чувствую / знаю, что мне не хватает базового понимания ассоциаций в приведенном выше коде.В частности, я хотел бы иметь возможность сказать что-то вроде: «myPick.rider1.name».Я также мог бы посмотреть, какие пики включают данного гонщика, например «myRider.picks» (хотя я не уверен, что это вообще возможно).И принципиально, я не уверен, что это правильная идея иметь три внешних ключа «всадника» в модели выбора.

Заранее спасибо за любые предложения.Ура, Жак

1 Ответ

1 голос
/ 18 июня 2011

Ваша ассоциация немного задом наперед.Стол с внешним ключом belongs_to стол без.Таким образом, у вас должно быть 3 belongs_to :rider1, :class => 'Rider' звонков вместо этих has_many звонков.

# player.rb:
class Player < ActiveRecord::Base
  has_many :picks
end

# pick.rb:
class Pick < ActiveRecord::Base
  belongs_to :rider1, :class => 'Rider'
  belongs_to :rider2, :class => 'Rider'
  belongs_to :rider3, :class => 'Rider'
  belongs_to :player

  def riders
    # returns an array so you can say pick.riders.each { |rider| ... }
    # but it doesn't give you an ActiveRecord::AssociationProxy so you cannot 
    # do things like pick.riders.where(:condition => true)
    [rider1, rider2, rider3]
  end
end

# rider.rb
class Rider < ActiveRecord::Base
  has_one :pick
end

Это все равно не будет таким же чистым, как выполнение has_many :riders и принудительное ограничение числагонщиков для каждого выбора (используя встроенные отношения, как предполагалось).

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