0

これは 2 部構成です。以下のアプローチのいずれか、または他の提案に満足しています。

モデルに検索語を渡し、モデル内の任意のフィールド、またはモデルが実行可能と見なす任意のフィールドでその検索語を検索することで、モデルを使用してレコード/オブジェクトを取得できるようにしたいと考えています。したがって、例として:

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

「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

メソッドはインスタンス メソッドです (このメソッドにアクセスするには、モデルをインスタンス化する必要があります)。where()Class メソッドが必要です (つまり、メソッドなどのように、それを呼び出すために Company のインスタンスは必要ありません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 に答える