web-dev-qa-db-ja.com

Rails "find_all_by" vs ".where"

私は次のコードを持っています:

def maturities
  InfoItem.find_all_by_work_order(self.work_order).map(&:maturity)
end

私はそれを次のように変更することを考えていました:

def maturities
  InfoItem.where(work_order: self.work_order).map(&:maturity)
end

これには何か利点がありますか?最近では、.wherefind_all_byよりも一般的であるようです。

26
ardavis

私の意見では、.whereを使用する方が良いアプローチです。

属性ベースのファインダーを使用する場合は、メソッドが見つからない呼び出しをトンネリングし、最終的にclass_evalを介して、結果を返すクラスメソッドを定義する必要があります。これは、必要のない追加処理です。

また、一緒に文字列を並べる:find_by_this_and_this_and_this_and_this ...は醜くなります。

Rails属性ベースのファインダーをここで達成する方法を参照

GithubのモジュールDynamicMatchersに欠落しているメソッド:

def method_missing(name, *arguments, &block)
  match = Method.match(self, name)

  if match && match.valid?
    match.define
    send(name, *arguments, &block)
  else
    super
  end
end
25
Kyle

主な利点は、find_all_byが動的セレクターのフィールドに制限される場所に追加の基準を追加できることです。あなたが検索している条件が1つしかない場合、それはウォッシュだと思いますが、3または4を追加し始めると、動的ファインダーは醜い場合があります。ハッシュはよく見ることができ、必要に応じて条件のハッシュをパラメーターとして渡すことができます。動的ファインダーはクールですが、どこがよりきれいにスケーリングされ、より読みやすいと思います。

2
holaSenor