中关村村草 发表于 2011-09-22 15:40

让查询变得更优雅

让查询变得更优雅


RailsWhere可以让代码变得更简洁。



看一下插件的自述文件。



Ruby代码
=== Returning SQL

sql = Where.new('x=?',5).and( Where.new('x=?',6).or('x=?',7)).to_s
# returns (x=5) and ( (x=6) or (x=7) )

=== Building a complicated where clause made easy

def get_search_query_string
   where = Where.new
   where.and('users.first_name like ?', params[:search_first_name] + '%') unless params[:search_first_name].blank?
   where.and('users.last_name like ?', params[:search_last_name] + '%') unless params[:search_last_name].blank?

   status_where = Where.new
   for status in params.split(',')
   status_where.or 'status=?', status
   end
   where.and status_where unless status_where.blank?

   where.to_s
end

User.find(:all, :conditions => get_search_query_string)

=== Inline

User.find(:all, :conditions => Where.new('first_name like ?', 'Tim').and('last_name like ?', 'Harper'))
Rails2.2.2下可以直接运行,Rails2.3.4的话,需要进行小小的改动:


Ruby代码
# RAILS_ROOT/vendor/railswhere/lib/where.rb

# 2.2.2
@criteria = ActiveRecord::Base.send(:sanitize_sql_array, criteria)

# 2.3.4
@criteria = ActiveRecord::Base.send(:sanitize_sql_array, criteria, nil)

2gua 发表于 2011-09-22 20:46

Rails发展更新得太快,3.0/3.1的变化还是比较大。

zhlong8 发表于 2011-09-23 10:10

一点也不优雅,过度包装

2gua 发表于 2011-09-23 12:30

功能的累加,必然导致复杂度和过度包装。
页: [1]
查看完整版本: 让查询变得更优雅