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