2014-11-19 2 views
0

У меня есть следующий код в инициализаторе Rails:рубин class.new блок не запускается

module Mongoid::ActiveRecordBridge 
    extend ActiveSupport::Concern 

    included do 
    def self.belongs_to_record(association_name, options={}) 
     association_class = (options[:class_name] || association_name.to_s.singularize.classify).constantize 
     # index(#{ association_name }_id: 1) 
     class_eval <<-EOS 
     field :#{ association_name }_id, type: Integer 
     def #{ association_name } 
      @#{ association_name } ||= #{ association_class }.where(id: #{ association_name }_id).first 
     end 
     def #{ association_name }=(object) 
      @#{ association_name } = object 
      self.#{ association_name }_id = object.try :id 
     end 
     EOS 
    end 
    end 
end 

MyCode.all.map do |class_code| 
    dynamic_class = "#{class_code.code}_field".classify 
    Object.const_set dynamic_class, Class.new do 
    include Mongoid::Document 
    include Mongoid::ActiveRecordBridge 

    belongs_to_record :classification_code 
    end 
end 

Он успешно создает объект класса, так что если class_code был SomeField, то SomeField будет инициализирован. Однако, когда я запускаю следующее возвращает ложь:

SomeField.respond_to? :belongs_to_record => false 

Но если построить еще один объект в консоли Rails, он отлично работает:

2.1.2 :003 > SomeRandomField = Class.new do 
2.1.2 :004 >  include Mongoid::Document 
2.1.2 :005?> include Mongoid::ActiveRecordBridge 
2.1.2 :006?> belongs_to_record :classification_code 
2.1.2 :007?> end 
=> SomeRandomField 
2.1.2 :008 > SomeRandomField.respond_to? :belongs_to_record 
=> true 

Почему, когда я делаю это в инициализаторе, это Безразлично Работает, но в консоли Rails это работает?

ответ

1

Это потому, что блок крепится к Object.const_set, не Class.new

использовать что-то вроде этого:

klass = Class.new do 
    include Mongoid::Document 
    include Mongoid::ActiveRecordBridge 

    belongs_to_record :classification_code 
end 

Object.const_set dynamic_class, klass 

Или использовать скобки для обеспечения правильной группировки.

Смежные вопросы