如何在不获取无效查询的情况下将uniq与select(" distinct")结合使用?

时间:2016-03-06 13:55:02

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我尝试将uniq语句与Active Record中的select("distinct")语句合并,结果导致两个DISTINCT个关键字,这当然会导致查询无效。这是我提出的最简单的例子。 (标记为简化以帮助您理解问题 - 我不仅仅是询问我如何从数据库中获取不同的ID。)

Product.all.uniq.select("distinct id").map(&:id)

This gives me this error message:
 Product Load (0.7ms)  SELECT DISTINCT distinct id FROM "products"
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "distinct"
LINE 1: SELECT DISTINCT distinct id FROM "products"
                    ^
: SELECT DISTINCT distinct id FROM "products"

为什么我在这里获得两个DISTRINCT个关键字?有什么办法可以避免吗?使用uniq两次有效,但我需要选择我正在实施的其中一个过滤器。

修改:select("distinct..")必须在uniq声明之前。

2 个答案:

答案 0 :(得分:1)

uniq已使用DISTINCT。使用uniqselect("DISTINCT")。此外,您应该使用pluck,而不是映射记录并选择id

你真正想要使用的是

Product.pluck(:id)

Product.all.ids

我不清楚,为什么要使用distinct。 ID如何具有重复值?

如果字段与id不同,只需使用

即可
Product.select("DISTINCT(field)").map(&:field)

甚至更好

Product.uniq.pluck(:field)

因此在你的情况下

Product.uniq.pluck(:id)
# => SELECT DISTINCT "products"."id" FROM "products"

答案 1 :(得分:0)

您可以使用uniq(false)停用之前使用的uniq范围。所以你的例子会是这样的:

scope = Product.all.uniq
scope.uniq(false).select("distinct id").map(&:id)

可以找到源代码文档here