27

次のコードがあります。

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

これに何か利点はありますか?.where現代よりも一般的なようですfind_all_by

4

2 に答える 2

28

私の意見では、使用.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
于 2012-06-27T19:23:08.493 に答える
2

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

于 2012-06-27T19:11:40.407 に答える