0

这是一个两方。我会对以下任何一种方法或其他建议感到满意。

我希望能够使用我的模型检索记录/对象,方法是向它传递一个搜索词并让它在模型的任何字段或模型认为可行的任何字段中查找该搜索词。所以,举个例子:

class Product < ActiveRecord::Base

...

  def search_all_fields(search_term)
    return search_term.length == 0 ? nil : Product.where("serial_number like :find_me", { :find_me => search_term })
  end
end

这是来自产品模型。Company 模型中的相同函数可能如下所示:

class Company < ActiveRecord::Base

...

  def search_all_fields(search_term)
    return search_term.length == 0 ? nil : Company.where("customer_number like :find_me or name like :find_me", { :find_me => search_term })
  end
end

我会喜欢一种“railsy”的方式来做到这一点,比如“find_by_looking_everywhere”,但我一直没能找到这样的东西。我发现了很多关于在单个字段中搜索多个值的建议,而不是在多个字段中搜索单个值的建议。所以这就是“第 1 部分”,有没有一种“轨道式”的方式来做到这一点?

“第 2 部分”...使用上面的代码,为什么会出现以下异常?

undefined method `search_all_fields` for #<Class:0xa38f2ac>

我正在使用@products = Product.search_all_fields("xy3445")或调用方法@companies = Company.search_all_fields("high")??跟踪显示异常仅由泛型类引发。它没有说#<Product...>#<Company...>

我有点失落......任何和所有的帮助表示赞赏。

谢谢,伙计。

4

1 回答 1

1

您的方法是实例方法(需要实例化模型才能访问此方法)。您需要一个 Class 方法(意味着您不需要 Company 的实例来调用它,例如 methodswhere()find())。

class Company < ActiveRecord::Base
  def say_hello
    return "Hello world!"
  end
end

此方法 say_hello 只能Company 的实例(实例方法)中调用:

company = Company.first
company.say_hello #=> "Hello world!"
# but this will raise a NoMethodError:
Company.say_hello #=> NoMethodError

为了将方法定义类方法,您可以执行以下操作:

class Company < ActiveRecord::Base
  def self.say_hello
    return "Hello world!"
  end

  # OR you can use the name of the model instead of the self keyword:
  def Company.say_hello
    return "HEllo World!"
  end
end

现在你可以这样做:

Company.say_hello
#=> "HEllo World!"
# but this will fail:
Company.first.say_hello
#=> NoMethodError
于 2013-05-10T17:15:43.633 回答