ArgumentError: неопределенный класс/модуль HABTM_Pubs в Rails 4

Я делаю систему для создания викторин для пабов. Чтобы паб не получил одну и ту же викторину дважды, пабы и викторины имеют связь многие ко многим.

class Quiz < ActiveRecord::Base
  has_and_belongs_to_many :pubs
  serialize :rounds, Array
  before_create :generate_rounds

  def generate_rounds
    # Round class initializes with array of pubs
    NUMBER_OF_ROUNDS.times { rounds << Round.new(pubs: self.pubs) }
  end 
end

class Pub < ActiveRecord::Base
  has_and_belongs_to_many :quizzes
end

В викторине есть раунды (массив объектов Round, содержащих вопросы), которые сериализуются с помощью метода ActiveRecord serialize.

Когда я запускаю этот код:

q = Quiz.new
q.pubs << Pub.create
q.save

Я получил:

ArgumentError: undefined class/module HABTM_Pubs

Раньше у меня было отношение «принадлежит_к» (викторина принадлежала одному пабу), и этой ошибки не возникало.

Когда я комментирую обратный вызов before_create (чтобы раунды не создавались), действие q.save завершается успешно.

Из моего schema.rb

create_table "pubs_quizzes", id: false, force: true do |t|
  t.integer "pub_id"
  t.integer "quiz_id"
end

Такие вещи, как Quiz.new.pubs, работают.

Изменить: трассировка стека

from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/class_loader.rb:53:in `path2class'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/class_loader.rb:53:in `resolve'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/class_loader.rb:45:in `find'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/class_loader.rb:27:in `load'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:360:in `resolve_class'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:87:in `deserialize'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:122:in `visit_Psych_Nodes_Scalar'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/visitor.rb:15:in `visit'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/visitor.rb:5:in `accept'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:31:in `accept'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:302:in `block in revive_hash'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:300:in `each'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:300:in `each_slice'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:300:in `revive_hash'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/to_ruby.rb:161:in `visit_Psych_Nodes_Mapping'
from /home/geert/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/psych/visitors/visitor.rb:15:in `visit'

Это должно быть как-то связано с сериализацией.

Соответствующий предмет? YAML::load вызывает ошибку неопределенного класса/модуля


person Kappie001    schedule 30.12.2014    source источник
comment
Вы создали совместный стол? с идентификатором как ложным, он требует реализации Has и принадлежит многим отношениям в рельсах.   -  person Amitkumar Jha    schedule 30.12.2014
comment
Ага, не опознается как-то? Я подозреваю, что что-то идет не так с сериализацией где-то. Я обновил исходный пост.   -  person Kappie001    schedule 30.12.2014
comment
Я обновил сообщение с трассировкой стека. Вся помощь приветствуется.   -  person Kappie001    schedule 31.12.2014


Ответы (1)


Сериализация массива с объектами, которые ссылаются на ассоциацию ActiveRecord, похоже, вызывает ошибку.

замена

Round.new(pubs: self.pubs)

с

Round.new(pub_ids: self.pubs.map { |pub| pub.id })

и получение пабов в самом классе Round устраняет ошибку.

person Kappie001    schedule 31.12.2014