在Rails中组合条件数组

我正在使用Rails3 beta,will_paginate gem和geokit gem&plugin。

作为geokit-rails插件,似乎不支持Rails3范围(包括:origin符号是问题),我需要使用.find语法。

代替范围,我需要以数组格式组合两组标准:

我有一个默认条件:

conditions = ["invoices.cancelled = ? AND invoices.paid = ?", false, false] 

我可能需要将以下条件之一添加到默认条件,具体取决于UI选择:

 #aged 0 lambda {["created_at IS NULL OR created_at = ? AND created_at  90 lamdba {["created_at >= ?", Date.today + 90.days]} 

生成的查询类似于:

 @invoices = Invoice.find( :all, :conditions => conditions, :origin => ll #current_user's lat/lng pair ).paginate(:per_page => @per_page, :page => params[:page]) 

问题:

  1. 是否有一种简单的方法来组合这两个条件数组(如果我的措辞正确)
  2. 虽然它没有解决这个问题,但是有没有一种DRYer方法来创建这些老化的桶?
  3. 有没有办法将Rails3范围与geokit-rails插件一起使用?

谢谢你的时间。

试试这个:

 ca = [["invoices.cancelled = ? AND invoices.paid = ?", false, false]] ca << ["created_at IS NULL OR created_at < ?", Date.today + 30.days] if aged == 0 ca << ["created_at >= ? AND created_at < ?", Date.today + 30.days, Date.today + 60.days] if aged == 30 ca << ["created_at >= ?", Date.today + 90.days] if aged > 30 condition = [ca.map{|c| c[0] }.join(" AND "), *ca.map{|c| c[1..-1] }.flatten] 

编辑方法2

Monkey补丁Array类。 在config/initializers目录中创建名为monkey_patch.rb的文件。

 class Array def where(*args) sql = args[0] unless (sql.is_a?(String) and sql.present?) return self end self[0] = self[0].present? ? " #{self[0]} AND #{sql} " : sql self.concat(args[1..-1]) end end 

现在你可以这样做:

 cond = [] cond.where("id = ?", params[id]) if params[id].present? cond.where("state IN (?)", states) unless states.empty? User.all(:conditions => cond) 

我认为更好的方法是使用匿名范围。
请在此处查看: http : //railscasts.com/episodes/112-anonymous-scopes