【问题标题】:RoR scope on each array-object每个数组对象上的 RoR 范围
【发布时间】:2012-01-25 06:26:46
【问题描述】:

我对 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 是一个来自一堆动态复选框的数组

这些值都很好,并且可以正确传递给模型。所以视图或控制器不应该是问题。

编辑2: 由于看起来有点不清楚,这里是目前的情况: 有一个由一个选择框和一堆复选框组成的表单。 选择框从表“设备”中获取其值,并在提交表单后将选定的值作为参数传递给控制器​​:d。 Checkboxes 是表“testtypes”的所有条目的列表,在提交表单后,它会将表中所有已检查的 testtype_ids 的数组作为参数传递给控制器​​:t。 (正常工作)

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

现在在“用户”表中有一个“测试”列,它指的是 HABTM 连接中的“测试”表,因此 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

有人可以帮我解决这个问题吗? 没人知道吗? :'(

【问题讨论】:

  • 告诉我们你有什么,你到底想要什么,因为我认为你真的走错了路;)
  • 我有一个表单,它由一个选择框和几个复选框(可以更改)组成。此表格应用于按所有 Pts 表中的“ts”列过滤表。 ts 列由 2 个值组成,因为它是另一个带有 HABTM (1. d, 2. t) 的表 (ts)。那些 ts 与 d 和 t 有另一个 HABTM 连接。 d 是来自表 d 的固定值(由 select_tag 选择),t 是来自表 t 的数组(由复选框选择)。我想要什么:只需过滤器工作并传递正确的 sql 请求,我就可以得到过滤后的表。 :)
  • 您收到语法错误,因为您不应该在 lambda { |df, ttf| 之后使用 {
  • 好的,语法错误已修复,非常感谢 :-) 但现在看来,sql 请求无法正常工作。一旦我选中一个复选框(不应该),我就会得到一个空列表
  • 我不知道您是否在 stackoverflow 中使用了短变量名,或者您的代码中是否有这种情况,但这让我们更难理解您的代码。

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


【解决方案1】:

听起来你想要类似的东西

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

这将允许您这样做

SomeModel.filter([23,24])

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

【讨论】:

  • 感谢您的回答,这正是它应该如何工作的。我将控制器部分添加到问题中。值被正确传递,但问题是,您的示例中的 23 可以是一个数组,我不知道如何为此编写正确的 sql 查询。
  • 这应该没什么区别。我已经更新了示例。
  • 但是我正在检查一个数组是否包含在另一个数组中,这不起作用。也许你理解我,我更新了问题以澄清问题。感谢您的帮助:)
  • 您的条件可以参考连接表以及关联表。除此之外,我不明白你在做什么
  • 我必须在第二次连接中检查该数组 (users=>tests=>testtypes) 过滤器应检查数组中的每个 id 是否不在每个测试的 testtypes 表中每个用户的。我不知道我应该如何用一个简单的 sql 查询来检查它。如果每个“检查”(通过复选框)testtype-id 未包含在用户参与的任何测试中,则该用户是查询应返回的用户之一。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多