Код в Railscasts 111 - Расширенная форма поиска - PullRequest
0 голосов
/ 09 июля 2010

В одном конкретном эпизоде ​​Railcasts Райан говорит о расширенном поиске и в том, что он использует некоторый код, чтобы найти условия для поиска.Поскольку его работа не объяснена, я хотел бы получить некоторые разъяснения по этому поводу.

def products
 @products ||= find_products
end

private

def find_products
 Product.find(:all, :conditions => conditions)
end

def keyword_conditions
["products.name LIKE ?", "%#{keywords}%"] unless keywords.blank?
end

def minimum_price_conditions
 ["products.price >= ?", minimum_price] unless minimum_price.blank?
end

def maximum_price_conditions
 ["products.price <= ?", maximum_price] unless maximum_price.blank?
end

def category_conditions
 ["products.category_id = ?", category_id] unless category_id.blank?
end

def conditions
 [conditions_clauses.join(' AND '), *conditions_options]
end

def conditions_clauses
 conditions_parts.map { |condition| condition.first }
end

def conditions_options
 conditions_parts.map { |condition| condition[1..-1] }.flatten
end

def conditions_parts
 private_methods(false).grep(/_conditions$/).map { |m| send(m) }.compact
end

Я хотел бы получить любую информацию о том, как это работает, особенно о методе products, поскольку он даже называет это как products.name и т. Д.

1 Ответ

1 голос
/ 09 июля 2010

Он определяет некоторые методы для условий в своей форме поиска: keyword_conditions, minimum_price_conditions и так далее. products.name означает поле name из таблицы products.

Способ

def conditions_parts
  private_methods(false).grep(/_conditions$/).map { |m| send(m) }.compact
end

использует отражение, чтобы посмотреть на закрытые методы этого класса, имя которых заканчивается на _conditions (регулярное выражение /_conditions$/) и объединяет только те, которые не возвращают null (compact)

Способ

def conditions
  [conditions_clauses.join(' AND '), *conditions_options]
end

добавляет ключевое слово AND между условиями и передает результат в Product.find, который выполняет запрос SQL и возвращает набор результатов.

...