2011-01-08 9 views
2

私はPost.find_by_slug('some-slug', :case_sensitive => false)Post.find_by_title('some title', :case_sensitive => false)をやりたいと思っています。重複コードなしでfind_by_xメソッドにcase_sensitivityオプションを追加する

私は、次のアプローチを試してみたが、重複したロジックの多くがあります:

def self.find_by_name(name, options = {}) 
    conditions = options[:case_sensitive] == false ? ['UPPER(name) = UPPER(?)', name] : ['name = ?', name] 
    first(:conditions => conditions) 
    end 

    def self.find_by_slug(slug, options = {}) 
    conditions = options[:case_sensitive] == false ? ['UPPER(slug) = UPPER(?)', slug] : ['slug = ?', slug] 
    first(:conditions => conditions) 
    end 

にはどうすれば重複コードなしすべてのfind_by_x方法について:case_sensitive => falseオプションを得ることができますか?

答えて

2

私にとって、これはmethod_missingを使用する素晴らしい機会のように聞こえます。基本的には、クラスにまだ存在しないメソッドをリッスンするクラスメソッドを実装します。

それはこのような何かを見ることができます:

def self.method_missing(method, *args, &block) 
    if method.to_s =~ /^find_by_(.*)$/ 
    condition = args.first 
    options = args.last 
    first(options[:case_sensitive] == false ? ["UPPER(#{$1}) = UPPER(?)", condition] : ["#{$1} = ?", condition]) 
    else 
    super 
    end 
end 

を今、あなたが行うことができる必要があります:

find_by_name('name', :case_sensitive => false) 
find_by_slug('slug', :case_sensitive => false) 
find_by_any_other_column('value', :case_sensitive => false) 
関連する問題