是否可以调用ActiveResource :: Base#load?

时间:2011-12-08 23:26:14

标签: ruby-on-rails

ActiveResource::Base#update_attributes方法调用ActiveResource::Base#load中定义的activeresource-3.1.3/lib/active_resource/base.rb方法(第1255行)。我试图调用load方法,而不是简单地使用update_attributes,以便不立即保存对象。

  1. 我使用全新的rails应用程序对此进行了测试。我搭建了一个简单的对象:

    rails scaffold obj property1:string
    
  2. 然后在rails控制台中:

    irb(main):001:0> obj=Obj.new
    irb(main):002:0> obj.load(:property1=>"data")
    TypeError: can't convert Hash into String
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:640:in `new_constants_in'
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:223:in `load_dependency'
    from .../activesupport-3.1.3/lib/active_support/dependencies.rb:234:in `load'
    from (irb):2
    
  3. 我看到activesupport-3.1.3/lib/active_support/dependencies.rbLoadable模块应用于Object,为每个对象提供了加载文件的load方法,但我无法弄清楚它为什么会覆盖ActiveResource::Base#load方法,而不是相反。

    我正在使用Rails 3.1.3和朋友。

    更新

    我想我已经回答了我自己的问题。我一直在尝试在ActiveRecord对象上使用ActiveResource方法。我知道我的Rails模型类是ActiveRecord::Base的后代,但不知何故,当我试图找到ActiveRecord::Base#update_attributes的代码时,我找到了ActiveResource::Base#update_attributes的代码,它看起来像这样:< / p>

    def update_attributes(attributes)
      load(attributes, false) && save
    end
    

    所以我一直在尝试调用load方法,该方法仅为activesupport提供的对象存在。如果我只查看了ActiveRecord::Base#update_attributes

    def update_attributes(attributes, options = {})
      # The following transaction covers any possible database side-effects of the
      # attributes assignment. For example, setting the IDs of a child collection.
      with_transaction_returning_status do
        self.assign_attributes(attributes, options)
        save
      end
    end
    

    我会看到assign_attributes方法就是我需要的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用.attributes

而不是这样做
obj = Obj.new
obj.attributes = { :property1 => "data" }

该实例具有新属性,但尚未保存。

阅读Docs了解详情。