我尝试将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
声明之前。
答案 0 :(得分:1)
uniq
已使用DISTINCT
。使用uniq
或select("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。