2

ここでの最初の回答で提案されているように、配列を使用して一連の条件を動的に構築しようとしています。モデル内の1つ以上のパラメーターが、RubyonRailsで条件を検索します。しかし、私は何か間違ったことをしているようで、私が試していることが根本的に正しくないのか、それとも単に構文を台無しにしているのかわかりません。

ここでは、問題を説明するために1つの条件に簡略化しています。これは、競合する5つの異なる条件スタイルを重ねる前に、これらの線に沿って単純な概念実証を構築しようとしたためです。

これは機能します:

excluded.push 12
excluded.push 30
@allsites = Site.all(:conditions => ["id not in (?)", excluded])

これにより、エラーと呼ばれるプライベートメソッド「スキャン」が発生します。

conditionsSet = []
excluded.push 12
excluded.push 30
conditionsSet << ["id not in (?)", excluded]
@allsites = Site.all(:conditions => conditionsSet)

アドバイスありがとうございます。一番上に書いた関連する質問/回答のフォローアップ項目としてこれを置くことが適切かどうかはわかりませんでした。私は問題を抱えているので答えではありません。既存の投稿に関連してこれを投稿するより良い方法がある場合は、私に知らせてください。

4

3 に答える 3

5

これを試して:

レール2.3

class Site < ActiveRecord::Base

  def self.build_conditions(ids, name=nil, state=nil)
     cond = []
     cond << send(:sanitize_sql_array, ["id NOT IN (?)", ids]) unless ids.empty?
     cond << send(:sanitize_sql_array, ["name = ? ", name]) unless name
     cond << send(:sanitize_sql_array, ["state = ? ", state]) unless state
     cond.join(" and ")
  end    
end

今あなたのコントローラーのどこかに:

Site.all(:conditions => Site.build_conditions([1,2])) 
Site.all(:conditions => Site.build_conditions(nil, "ABC"))

Rails 3

class Site < ActiveRecord::Base          
  def self.exclude_ids_by_name_and_state(ids, name=nil, state=nil)
    result = scoped
    result = result.where("id NOT IN (?)", ids) if ids.present?
    result = result.where(:name => name) if name.present?
    result = result.where(:state => state) if state.present?
    result
  end    
end

今あなたのコントローラーのどこかに:

Site.exclude_ids_by_name_and_state([1,2])).all 
Site.exclude_ids_by_name_and_state(nil, "ABC").all
于 2010-03-24T22:02:39.010 に答える
3

あなたが欲しい:

conditionsSet += ["id not in (?)", excluded]

それ以外の:

conditionsSet << ["id not in (?)", excluded]

+=<<新しい要素を配列にプッシュしながら、2つの配列を一緒に追加します(2つを1つの配列にマージすると考えてください) 。したがって、次のようになります。[["id not in (?)", excluded]]を使用する場合<<:conditionsこの最初の要素が文字列(配列ではない)である配列が必要です。

于 2010-03-24T21:09:06.290 に答える
2

SmartTupleをお試しください。このような場合のために特別に設計されています。

def self.build_conditions(options = {})
  [
    SmartTuple.new(" AND "),
    (["id NOT IN (?)", ids] if options[:ids].present?),
    ({:name => options[:name]} if options[:name].present?),
    ({:state => options[:state]} if options[:state].present?),
  ].sum.compile
end

...

Site.all(:conditions => Site.build_conditions(:ids => {1,2]))
Site.all(:conditions => Site.build_conditions(:name => "abc", :state => "disabled")

私にとってoptionsは、順序付けられた引数の代わりにハッシュを使用することも好ましいです。プロジェクトが成長するにつれて、より多くの条件が表示される可能性があり、どちらが来るかを追跡できなくなります。ハッシュの外観と動作がより明確になり、ソフトウェアエラーを回避するためにハッシュを簡単に検証できます。

于 2010-07-23T19:25:45.840 に答える