Добавление параметра case_sensitivity в методы find_by_x без дублированного кода - PullRequest
2 голосов
/ 09 января 2011

Я хочу быть в состоянии сделать Post.find_by_slug('some-slug', :case_sensitive => false), Post.find_by_title('some title', :case_sensitive => false).

Я пробовал следующий подход, но в нем много дублирующейся логики:

  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

Как я могу получить опцию :case_sensitive => false для всех методов find_by_x без дублирующегося кода?

1 Ответ

2 голосов
/ 09 января 2011

Для меня это звучит как отличная возможность использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...