方法缺少update_attribute

时间:2014-05-20 02:44:40

标签: ruby-on-rails ruby background-process sidekiq

我有三种模式:

  1. 商店(has_many :products
  2. 产品(has_many :product_fieldsbelongs_to :store
  3. Product_fields(有一个belongs_to :product
  4. 我使用Sidekiq更新名为content的product_fields中的列(当我创建模型时,我在名为second_content的同一模型的列中插入一个url,因此原始内容列在创建时为null ,但后来我试图将我的工作人员的内容列更新为新值。这是我的工作人员:

    def perform(store_id)
       store = Store.find(store_id)
    
       store.products.each do |product|
          if product.type_of == "Video"
            video_url = URI.parse product.product_fields[0].second_content
            video = open("LINK HERE").read
            video = ActiveSupport::JSON.decode video
    
            product.product_fields[0].update_attribute(:content, video)
          end
       end
    end
    

    我的控制器的创建操作如下:

    def create
       @store = Store.new(store_params)
       respond_to do |format|
          if @store.save
    
              #Start video job
              VideosWorker.perform_async(@store.id)
    
              format.html { redirect_to @store, notice: 'Store was successfully created.' }
          end
       end
    end
    

    一切似乎都在起作用,除了在Sidekiq终端我得到错误:

    undefined method `update_attribute' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_ProductField:0x0000010531bdd8>
    

1 个答案:

答案 0 :(得分:1)

使用:

product.product_fields.first.update_attribute(:content, video)

而不是:

product.product_fields[0].update_attribute(:content, video)

,因为您无法在update_attribute对象上调用CollectionProxy,也请确保video是字符串