每个数组对象的RoR范围

时间:2011-12-21 12:31:49

标签: ruby-on-rails ruby arrays scope each

我对RoR很新,所以这可能是一个新手问题,但我无法找到答案并解决问题。 我需要检查动态数组中的每个元素(由连接表上的HABTM连接创建)以获取条件。

现在我有这样的事情:

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的固定值 :t是一个来自一堆动态复选框的数组

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

EDIT2: 由于它看起来有点不清楚,这是目前的情况: 有一个表格,包括一个选择框和一堆复选框。 Select-Box从表格" devices"中获取其值。在提交表单后,它将选定的值作为参数传递给控制器​​:d。 复选框是表格中所有条目的列表" testtypes"并且在提交表单之后,它将所有已检查的testtype_ids数组从表传递给控制器​​作为param:t。 (正常工作)

现在还有另一张表"测试"它与设备和测试类型中的所有条目都有HABTM连接,因此我可以在一个条目中收集来自1个设备和多个测试类型的特殊连接。

现在在表格中#34;用户"有一个专栏"测试"这是指表"测试"在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

有人可以帮我吗? 没有人有想法? :'(

1 个答案:

答案 0 :(得分:3)

听起来像是想要像

这样的东西
scope :filter, lambda {|df| includes(:ts).where("foo_id in (?)", df)

允许你做

SomeModel.filter([23,24])

并且该数组将传递给lambda以供您在条件中使用。