2

Rails3 ベータ版、will_paginate gem、および geokit gem & plugin を使用しています。

geokit-rails プラグインは Rails3 スコープをサポートしていないようです (:origin シンボルが問題です)。.find 構文を使用する必要があります。

スコープの代わりに、2 つの基準セットを配列形式で組み合わせる必要があります。

デフォルトの条件があります:

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

UI の選択に応じて、次の条件のいずれかをデフォルトの条件に追加する必要がある場合があります。

#aged 0
lambda {["created_at IS NULL OR created_at < ?", Date.today + 30.days]}
#aged 30
lambda {["created_at >= ? AND created_at < ?", Date.today + 30.days, Date.today + 60.days]}
#aged > 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 つの条件の配列を組み合わせる簡単な方法はありますか (正しく表現した場合)
  2. 問題に寄与していませんが、これらの古いバケツを作成するための DRYer な方法はありますか?
  3. 動作する geokit-rails プラグインで Rails3 スコープを使用する方法はありますか?

御時間ありがとうございます。

4

2 に答える 2

3

これを試して:

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 の編集

サルはArrayクラスにパッチを当てます。monkey_patch.rbディレクトリにというファイルを作成しますconfig/initializers

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)
于 2010-07-15T03:00:00.713 に答える
2

より良い方法は、匿名スコープを使用することだと思います。
ここでチェックしてください: http://railscasts.com/episodes/112-anonymous-scopes

于 2011-02-01T08:44:11.757 に答える