2011-12-21 24 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] 
    } 
    } 
} 

这说明我一个语法错误。 但我认为,即使我设法得到它的工作方式,它不会正确执行sql查询,因为ts和tts是通过HABTM连接的,所以表中的实际值为NULL,并且我将不得不创建另一个连接,查询。 我真的没有线索如何解决这个问题。 任何提示都会有所帮助。

谢谢, 尼科

编辑: 我的控制器看起来像这样

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

:d为固定值,其是从select_tag 正在添加:吨是从一个正在添加的阵列大量的动态复选框

值都很好,并正确传递给模型。所以视图或控制器不应该成为问题。

编辑2: 由于它看起来有点不清楚,下面是目前的情况: 有一种形式,包括一个选择框和一堆复选框。 选择框从表格“设备”中获取其值,并在表单提交后将选定的值作为参数传递给控制器​​:d。 复选框是来自表“testtypes”的所有条目的列表,并且在提交表单之后,它将所有检查过的testtype_id的数组作为参数传递给控制器​​。 (正常工作)

现在有另一个表“测试”,它具有到设备和测试类型中所有条目的HABTM连接,所以我可以从1个设备和多个测试类型一起收集特定连接。

现在在“用户”表中有一列“测试”,它指的是HABTM连接中的表“测试”,因此1个用户可以有(参与)多个测试(可以有多个测试类型)。

因此,在提交表单后,值:d和:t应该用于sql查询以通过测试过滤所有用户(而测试依赖于设备和测试类型)。因此,所有用户都应该通过设备(:d)和testtypes(: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 2011-12-21 12:45:14

+0

我有一个表格,其中包含一个选择框和一些复选框(可以改变)。这个表格应该被用来过滤所有Pts表格中列“ts”的表格。列ts由2个值组成,因为它是具有HABTM的另一个表(ts)(1.d,2.t)。而且这些ts与d和t有另一个HABTM连接。 d是表d中的一个固定值(由select_tag选择)并且t是从表t中返回的数组(由复选框选择)。我想要的:简单的过滤器工作,并传递正确的SQL请求,所以我得到过滤表。 :) – Nikom 2011-12-21 13:05:35

+0

由于不应在'lambda {| df,ttf |'之后使用'{'''',所以出现语法错误。 – Mischa 2011-12-21 13:25:34

回答

3

听起来像是你想要的东西,像

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

,这将允许你做

SomeModel.filter([23,24]) 

这该数组将被传递到拉姆达为你的条件下使用

+0

感谢您的答案,这正是它应该如何工作。我在问题中添加了控制器部分。值正在被正确传递,但问题是,在你的例子中的23可以是一个数组,我不知道如何正确的sql查询。 – Nikom 2011-12-21 12:58:42

+0

这应该没有太大的区别。我更新了这个例子。 – 2011-12-21 13:04:51

+0

但我正在检查一个数组是否包含在另一个数组中,并且这不起作用。也许你了解我,我更新了问题以澄清事情。感谢您的帮助:) – Nikom 2011-12-21 13:46:06