Комплексная ассоциация ActiveRecord

возникли проблемы с настройкой некоторых отношений Active Record.

Users Leagues

Users много PrimaryLeagues Users много SecondaryLeagues

Я хотел бы иметь возможность написать @user.primary_leagues и получить список Leagues, которые были установлены как основные. и @user.secondary_leagues и получите список Leagues, которые были установлены как второстепенные.

В настоящее время вот как настроены мои классы, но это как-то неправильно ....

class User < ActiveRecord::Base

has_many :primary_leagues, class_name: 'PrimaryLeague', foreign_key: 'league_id'

has_many :secondary_leagues, class_name: 'SecondaryLeague', foreign_key: 'league_id'

...

class PrimaryLeague < ActiveRecord::Base

belongs_to :user
belongs_to :league

...

class League < ActiveRecord::Base

has_many :primary_users, class_name: 'PrimaryLeague', foreign_key: 'user_id'
has_many :secondary_users, class_name: 'SecondaryLeague', foreign_key: 'user_id'

Любые идеи?


person slindsey3000    schedule 15.09.2013    source источник


Ответы (1)


Насколько я понимаю, вы хотите использовать только два класса для всего (и это имеет смысл). Так:

class User < ActiveRecord::Base
  has_many        :primary_league_ownerships
  has_many        :primary_leagues,
                  :through => :primary_league_ownerships,
                  :source => :league
  has_many        :secondary_league_ownerships
  has_many        :secondary_leagues,
                  :through => :secondary_league_ownerships,
                  :source => :league
end

class PrimaryLeagueOwnership < ActiveRecord::Base
  belongs_to      :user
  belongs_to      :league
end

class SecondaryLeagueOwnership < ActiveRecord::Base
  belongs_to      :user
  belongs_to      :league
end

class League < ActiveRecord::Base
  has_many        :primary_league_ownerships
  has_many        :primary_users,
                  :through => :primary_league_ownerships,
                  :source => :user
  has_many        :secondary_league_ownerships
  has_many        :secondary_users,
                  :through => :secondary_league_ownerships,
                  :source => :user
end

Имейте в виду, что :class_name должен быть фактическим классом, который будет содержать целевую ассоциацию.

person Marcelo De Polli    schedule 15.09.2013
comment
депа спасибо! В лигах может быть много primary_users ... Я также хотел бы иметь возможность сказать @ league.primary_users ... подумал, может быть, мне нужно иметь много через ассоциацию? - person slindsey3000; 15.09.2013
comment
assert_valid_keys ': Неизвестный ключ: association_foreign_key (ArgumentError) .... должна ли это быть ассоциация has_and_belongs_to_many? - person slindsey3000; 16.09.2013
comment
Ты прав, я ошибся. Вероятно, это должно было быть :foreign_key, а не :association_foreign_key. Если вы посмотрите на варианты, принимаемые ассоциацией has_many, :association_foreign_key просто не входит в их число. guides.rubyonrails.org/ - person Marcelo De Polli; 16.09.2013
comment
Спасибо, депа. Я понял это и обновил свой код. Возможно, вы захотите обновить ответ, если его увидят другие. Отличная помощь ... сейчас провожу тесты ... проверяю, все ли работает! - person slindsey3000; 16.09.2013
comment
Не удалось найти исходные ассоциации: primary_league или: primary_league в модели PrimaryLeagueOwnership. Попробуйте 'has_many: primary_league,: through = ›: primary_league_ownerships,: source =› ‹name›'. Это один из: user или: league? - person slindsey3000; 16.09.2013
comment
Получил эту ошибку, когда попросил current_user.primary_league в моем контроллере - person slindsey3000; 16.09.2013
comment
позвольте нам продолжить обсуждение в чате - person Marcelo De Polli; 16.09.2013