我在轨道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] }
答案 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)