2014-12-30 3 views
0

Я создаю систему для создания пробных пабов для пабов. Чтобы паб не получал одну и ту же викторину дважды, пабы и викторины имеют много-много ассоциаций.ArgumentError: undefined class/module HABTM_Pubs in 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 

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

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

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

я получил:

ArgumentError: undefined class/module HABTM_Pubs 

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

Когда я комментирую обратный вызов 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 работы.

Edit: трассировка стека

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 raises undefined class/module error

+0

Вы создали совместный стол? с id как ложным, ему требуется реализовать Has и принадлежит многим отношениям в rails. –

+0

Да, разве это не признано? Я подозреваю, что это неправильно с сериализацией где-то. Я обновил оригинальный пост. – Kappie001

+0

Я обновил сообщение с помощью трассировки стека. Вся помощь была оценена. – Kappie001

ответ

1

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

замена

Round.new(pubs: self.pubs) 

с

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

и выборки пабов в Круглом классе сам делает ошибку уйти.