Mongoid方法调用的NoMethodError

时间:2014-04-08 15:10:25

标签: ruby-on-rails mongoid

我在我的模型中调用另一个模型的类方法,似乎找不到它。

详情

add_existing_itemsCategory的实例方法,我从中调用元数据的类方法,但这会失败并显示错误。

Caught exception : NoMethodError : undefined method `update_or_add_metadata' for Mongoid::Relations::Metadata:Class
/Users/anil20787/workspace/repos/anil_reps/metadata_favorite/app/models/category.rb:36:in `block in add_existing_items'

当我从类别控制器调用它时,对Metadata的类方法的调用非常正常。

类别模型:

class Category
  include Mongoid::Document

  belongs_to :catalog
  has_many :category_items

  # fields go here

  # validations go here

  def add_existing_items(inputs)
    if inputs[:category_item_ids] && inputs[:category_item_ids].kind_of?(Array)
      inputs[:category_item_ids].each do |category_item_id|
        category_item = CategoryItem.find(category_item_id)
        new_item = category_item.dup
        new_item.category = self
        new_item.save!
        # 'new_item' document gets saved successfully
        # But the below call to class method of another class fails! Why?
        Metadata.update_or_add_metadata(new_item, true)
      end
    end
  end
end

元数据模型:

class Metadata
  include Mongoid::Document
  include Mongoid::Timestamps

  # fields go here
  # validations go here
  belongs_to :outlet

  # instance methods go here

  class << self
    def update_or_add_metadata(item, create_new_boolean)
      # do the updating work
    end 
  end
end

为什么我会看到这个问题?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

问题是,当您放置行Metadata.update_or_add_metadata(new_item, true)时,它默认引用类Mongoid::Relations::Metadata,而不是您定义的类Metadata

因此,您需要使用范围解析运算符Metadata为您的::类提供实际路径。那就不会有任何问题。 update_or_add_metadata单例方法在您定义的类Metadata的单例类中定义,而不是在Mongoid::Relations::Metadata类的单例类中定义。