rails find_by_looking_in_every_field ...或......“为什么我的功能丢失了?”

时间:2013-05-10 16:50:31

标签: ruby-on-rails ruby model

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

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

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

这来自产品型号。公司模型中的相同功能可能如下所示:

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

我会喜欢这种方式,比如“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...>

我有点失落......任何和所有帮助都赞赏。

谢谢,帮派。

1 个答案:

答案 0 :(得分:1)

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

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

此方法say_hello只能从公司的实例调用(实例方法):

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