rails 3.1.0 belongs_to 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

在控制台和规范存根中,员工工作。在新任务中引用存根的employee对象会产生以下错误:

Factory.create( :task, :employee => Factory.stub(:employee) )   
NoMethodError:
   undefined method `[]' for #<Employee:0x007fc06b1c7798> 

编辑

这不是工厂女工的问题。如果在控制台中执行以下操作,则会得到相同的错误。

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

必须与belongs_to如何映射id列有关

我不喜欢猴子补丁,所以我创建了一个模块,我将包括在初始化扩展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

希望对大家有所帮助

最新更新