Railscasts中的代码111-高级搜索表单

时间:2010-07-09 07:11:01

标签: ruby-on-rails search railscasts

在一个特定的Railcasts剧集中,Ryan谈到了高级搜索,他使用了一些代码来找到搜索的条件。由于没有解释它的工作,我想要对它进行一些澄清。

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.name等。

1 个答案:

答案 0 :(得分:1)

他在搜索表单中为条件定义了一些方法:keyword_conditionsminimum_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查询并返回结果集。