рельсы 3.1.0 принадлежит_к ActiveResource больше не работает

Я обновляюсь с rails 3.0.7 до 3.1, и у меня возникают проблемы с прохождением моих тестов. Проблема возникает, когда я пытаюсь использовать заглушенный объект активного ресурса на фабрике.

#employee.rb   
class Employee < ActiveResource::Base; end

#task.rb
class Task < ActiveRecord::Base
  belongs_to :employee
end

#factories.rb
Factory.define :employee do |e|
  e.name "name"
end

Factory.define :task do |t|
  t.employee { Factory.stub(:employee) }
end

На приставке и в спеке стабинг у сотрудника работает. Ссылка на заглушенный объект сотрудника в новой задаче дает следующую ошибку.

Factory.create( :task, :employee => Factory.stub(:employee) )   

NoMethodError:
   undefined method `[]' for #<Employee:0x007fc06b1c7798> 

РЕДАКТИРОВАТЬ

Это не проблема фабричных девушек. Я получаю ту же ошибку, если делаю следующее в консоли.

Task.new( :employee => Employee.first )

Это должно быть связано с тем, как own_to сопоставляет столбец id.


person Aaron Renoir    schedule 01.09.2011    source источник
comment
Пожалуйста, добавьте ответ и отметьте его как правильный ответ. Спасибо, что опубликовали это.   -  person WattsInABox    schedule 19.09.2011


Ответы (1)


Мне не понравился патч для обезьян, поэтому я создал модуль, который буду включать при инициализации для расширения ActiveRecord.

module BelongsToActiveResource

    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods

    def ar_belongs_to( name, options = {} )
      class_eval %(
        def #{name}
          @#{name} ||= #{options[:class_name] || name.to_s.classify }.find( #{options[:foreign_key] || name.to_s + "_id" } )
        end

        def #{name}=(obj)
          @#{name} ||= obj
          self.#{ options[:foreign_key] || name.to_s + "_id" } = @#{name}.#{ options[:primary_key ] || 'id' }
        end
      )
    end

  end

end   

ActiveRecord::Base.class_eval { include BelongsToActiveResource }

Тогда в каждой модели ActiveRecord будет выглядеть так:

 #task.rb
 class Task < ActiveRecord::Base
   ar_belongs_to :employee
 end

Надеюсь, это поможет кому-то

person Aaron Renoir    schedule 13.01.2012