0

在 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,因为他甚至将其称为 products.name 等。

4

1 回答 1

1

他为他的搜索表单中的条件定义了一些方法:keyword_conditionsminimum_price_conditions等等。products.name表示name表中的字段products

方法

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

使用反射来查看这个类的私有方法,这些私有方法的名称以_conditions(The regex /_conditions$/) 结尾,并且只加入那些不返回null( compact)

方法

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

在条件之间添加一个AND关键字并将结果传递给Product.find进行 SQL 查询并返回结果集。

于 2010-07-09T07:21:13.760 回答