Rails:在一次通话中获取两组ID?

时间:2016-04-28 19:22:09

标签: ruby-on-rails ruby postgresql

我在轨道4上并使用Postres 9.4。我的代码目前如下:

array1 = Model.where(some_condition1).ids
array2 = Model.where(some_condition2).ids

有没有办法在只读取一个数据库的情况下获得相同的结果?形式如下:

master_array = <the solution>

并且master_array的每个元素都是类似的形式(我知道id满足哪些条件):

[id, some_condition1?, some_condition2?]

所以我可以很快做到:

array1 = master_array.select { |n| n[1] }.map { |n| n[0] }
array2 = master_array.select { |n| n[2] }.map { |n| n[0] }

3 个答案:

答案 0 :(得分:1)

让我们更改SELECT以返回id加上两个自定义列,表示每个条件的布尔值。这将填充可爱的小模型,仅包含您要求的属性,但会将您的自定义列名作为方法响应。

results = Model.select("id, #{some_condition1} as condition1, #{some_condition2} as condition2").where("(#{some_condition1}) OR (#{some_condition2}")

然后,只需检查名为condition1的列(或任何您想要调用的列),并根据返回true的模型创建数组。

array1 = results.select(&:condition1).map(&:id)
array2 = results.select(&:condition2).map(&:id)

答案 1 :(得分:0)

取决于您的条件的复杂性,但对于相当简单的条件,我建议您使用OR条件查询

results = Model.where('(some_condition1) OR (some_condition2)')

然后使用Array select分成两个数组:

array1 = results.select {|itm| itm == 'something which covers some_condition1'}
array2 = results.select {|itm| itm == 'something which covers some_condition2'}

答案 2 :(得分:-1)

理想情况下,你会想要这样的东西:

Model.where(some_condition1).or.where(some_condition2).pluck(:id)

但是这不可用,yet。您也可以使用arel_table,但我要做的是明确地编写查询。

Model.where('some_condition1 = ? OR some_condition2 = ?', condition1, condition2).pluck(:id)