Rails, has_many :through, неопределенный метод to_sym для nil:NilClass

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

2.0.0-p643 :001 > Tournament.new.participants
NoMethodError: undefined method `to_sym' for nil:NilClass
from /home/marcin/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.1.8/lib/active_record/reflection.rb:100:in `_reflect_on_association'
from /home/marcin/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.1.8/lib/active_record/reflection.rb:537:in `source_reflection'

Пользовательская модель

class User < ActiveRecord::Base
  has_many :participants_tournaments
  has_many :participated_tournaments, :through => :participants_tournaments
end

Турнирная модель

class Tournament < ActiveRecord::Base
  has_many :participants_tournaments
  has_many :participants, :through => :participants_tournaments
end

УчастникиТурнирная модель

class ParticipantsTournament < ActiveRecord::Base
  belongs_to :tournament
  belongs_to :user
end

УчастникиТурнирный перенос

def change
  create_table :participants_tournaments, :id => false do |t|
    t.integer "tournament_id",
    t.integer "user_id"
  end
end

Я прочитал: Эта тема на SO, также эта тема и смотрел/читал этот рельсовый эфир, но я не могу заставить его наконец работать.


person Marcin    schedule 26.03.2015    source источник
comment
вы можете попробовать t = Tournament.new, а затем t.participants?   -  person sixty4bit    schedule 26.03.2015
comment
с has_many :through Я почти уверен, что в таблице соединений требуется столбец id для первичных ключей, поэтому при создании этой таблицы убедитесь, что вы удалили :id => false при миграции.   -  person maxhungry    schedule 26.03.2015
comment
@MaxHung Вам не нужен идентификатор в таблице соединений. Вам нужны только идентификаторы для вещей, к которым вы присоединяетесь.   -  person Austio    schedule 26.03.2015
comment
@ sixty4bit да, это дало бы мне такой же результат :) Ответ Ausio - правильный, который действительно помог мне, но спасибо!   -  person Marcin    schedule 26.03.2015


Ответы (1)


Когда вы коллируете .new на турнирах, у него нет id, поэтому будет nil. Поэтому не найдет пользователя.

Кроме того, когда вы переназначаете модель в таком множестве, вы должны сообщить активной записи, что это за модель, которую она ищет. Вы делаете это с аргументом :source. Вот как будет работать турнир.

class Tournament < ActiveRecord::Base
  has_many :participants_tournaments
  has_many :participants, :through => :participants_tournaments, :source => :user
end
person Austio    schedule 26.03.2015
comment
Спасибо! Это имеет большой смысл с опцией :source, но когда я гуглил ранее, об этом не упоминалось. Большое тебе спасибо! - person Marcin; 26.03.2015