2011-12-21 11 views
1

これは初心者の質問かもしれないので、私はかなりRoRに新しいですが、私はそれに答えを見つけて問題を解決できませんでした。 条件のために、動的配列(結合テーブルを介してHABTM接続によって作成される)からすべての要素をチェックする必要があります。これは私に構文エラーを示し各アレイオブジェクトのRoRスコープ

scope :filter, lambda { |devicefilter, testtypefilter| 
    { 
    testtypefilter.each { |testtype|  
     :include => :tests, 
     :conditions => ['(tests.device != ? OR tests.device IS ?) AND ? NOT IN tests.testtypes', devicefilter, nil, testtype] 
    } 
    } 
} 

今私はこのような何かを持っています。 しかし、私はそれがtsとttsはHABTMによって接続されているので、SQLのクエリを正しく実行しないので、テーブルの実際の値はNULLであり、私は別の結合を作成する必要があるので、クエリ。 私は本当にこれを解決する方法を知りませんでした。 ヒントがあれば助かります。

おかげで、 ニコ

編集: 私のコントローラは、この

if params[:d] == nil or params[:t] == nil 
    @users = User.all 
else 
    @users = User.filter(params[:d], params[:t]) 
end 

次のようになります。dがselect_tag から来ている固定値である:tがから来ている配列です

値がすべて正しくモデルに正しく渡されています。したがって、ビューまたはコントローラは問題ではありません。

Edit2: 少し不明なので、ここに現状があります: セレクトボックスと複数のチェックボックスで構成されるフォームがあります。 Select-Boxはテーブル "devices"から値を取得しており、フォームが送信された後、選択された値がパラメータとしてコントローラに渡されます。d。 チェックボックスはテーブル "testtypes"のすべてのエントリのリストで、フォームが送信された後、チェックされたすべてのtesttype_idsの配列がテーブルからコントローラにパラメータとして渡されます。

ここで、デバイスとテストタイプのすべてのエントリに対するHABTM接続を持つ別のテーブル「テスト」があります.1つのデバイスと複数のテストタイプを1つのエントリにまとめて特別な接続を集めることができます。

テーブル "users"には、HABTM接続のテーブル "tests"を参照する "tests"という列があり、1人のユーザーが複数のテスト(複数のテストタイプを持つことができます)を持つことができます。

フォームが送信された後、dおよびtは、すべてのユーザーをテストでフィルタリングするSQLクエリ(テストはデバイスとテストタイプによって異なります)に使用されます。したがって、すべてのユーザーは、カラムテストで、デバイス(:d)とテストタイプ(:t [])の参照テストの値をチェックする必要があります。

しかし、testtypes(:t [])は配列として渡されているので、何とかその配列のすべての要素をSQLリクエストでチェックする必要があります。または配列全体をチェックする方法はありますか?

例:

There are 3 Devices: (dynamic table) 
A01 
A02 
A03 
There are 3 Testtypes: (dynamic table) 
TT01 
TT02 
TT03 
There are 4 Tests: (dynamic table with HABTM devices and testtypes) 
T1 = A01 - TT01/TT03 
T2 = A01 - TT03 
T3 = A02 - TT02/TT03 
T4 = A03 - TT01/TT02/TT03 
There are 5 Users: (dynamic table with HABTM tests) 
U1 = ... T1 ... 
U2 = ... T2/T4 ... 
U3 = ... T3/T4 ... 
U4 = ... T1/T2/T3 ... 
U5 = ... T3/T4 ... 

Now the Form will look like: 
Device: Select-Box={A01/A02/A03} 
Testtypes: Checkboxes={TT01/TT02/TT03} 

If i select now A01, check TT01+TT02 and submit the query should return every single User who has not participated in the following Tests: 
A01 - TT01 
A01 - TT02 

So at last i get a list of users that i could use for the test A01 - TT01+TT03, since there are no conflicts. 
So the query would return every user who has not participated in T1, since that is the only conflict. 
So the userlist would look like: 
U2 
U3 
U5 

誰かがこれで私を助けることができますか? いいえ、考えられませんでしたか?: '(

+0

あなたが持っているものを教えてください。あなたが本当に間違った方法をとっているからです。 – Robin

+0

私は選択ボックスといくつかのチェックボックスからなるフォームを持っています変化する可能性があります)。このフォームを使用して、すべてのPtsの表の列「ts」で表をフィルター処理する必要があります。列tsはHABTM(1.d、2.t)を持つ別の表(ts)であるため、2つの値で構成されています。そして、それらのtは、dとtとの別のHABTM接続を有する。 dはテーブルdからの固定値(select_tagで選択)、tはテーブルtからの配列(チェックボックスで選択)です。私が欲しいもの:単にフィルタが動作し、正しいSQLリクエストを渡すので、フィルタリングされたテーブルが得られます。 :) – Nikom

+0

'lambda {| df、ttf |'の後に '{'を使用しないでください。 – Mischa

答えて

3
あなたが

SomeModel.filter([23,24]) 

そして、あなたが条件で使用するためにその配列がラムダに渡されることを行うことができます

scope :filter, lambda {|df| includes(:ts).where("foo_id in (?)", df) 

のような何かをしたいよう

が鳴り

+0

答えをありがとう、それは正確にどのように動作する必要があります。質問にコントローラの部分を追加しました。値は正しく渡されていますが、問題は、例の23が配列であり、正しいSQLクエリをどのようにwirteするかわからないということです。 – Nikom

+0

それはあまり差がないはずです。私は例を更新しました。 –

+0

しかし、配列が別の配列に含まれているかどうかを確認していますが、これはそのようには動作しません。たぶんあなたは私を理解した、私は物事をクリアするために質問を更新しました。助けてくれてありがとうtho :) – Nikom