在一个特定的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等。
答案 0 :(得分:1)
他在搜索表单中为条件定义了一些方法: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查询并返回结果集。