Rails:如何从列中获取唯一值

问题描述 投票:0回答:8

如何从表中的列中获取唯一值? 例如,我有这个产品表:

ID NAME CATEGORY
1 name1 1st_cat
2 name2 2nd_cat
3 name3 1st_cat

这里我只想获取 2 个值 - 1st_cat 和 2nd_cat:

<%Products.each do |p|%>
<%=p.category%>
<%end%>
ruby-on-rails ruby-on-rails-3 unique
8个回答
207
投票

另外两种方法:

Product.select(:category).map(&:category).uniq # Ruby does the work

Product.uniq.pluck(:category) # DB does the work (superior)

对于 Rails >= 5.1 使用:

Product.distinct.pluck(:category) # DB does the work (superior)

...因为

Relation#uniq
已被 弃用


27
投票

我认为你可以做到这一点:

<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>

来源:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields


13
投票

这完成了数据库服务器中的所有工作。结果是一个简单的数组。

<% Product.distinct(:category).pluck(:category).each do |category|
    <%= category %>
<% end %>

Rails 将生成适用于任何数据库(Postgres、MySQL 等)的 SQL。

SELECT DISTINCT "products"."category" FROM "products"

9
投票

我建议使用

Product.all.distinct.pluck(:category)
,因为
uniq
自 Rails 5 起已被弃用,并且将在 Rails 5.1 上删除


6
投票

尝试这个(在 Rails 控制台中)

Product.group(:category)

Product.group(:category).each { |p| p.name }

5
投票

对于 postgres

<% Product.select("DISTINCT ON (category) *").each do |category|
    <%= category %>
    <%= name %>
<% end %>

更新

甚至更好

<% Product.select(%(DISTINCT ON (category) "#{Product.table_name}".*)).each do |category|
    <%= category %>
    <%= name %>
<% end %>

因为当您这样做时,它可能会返回错误的列

joins
(例如,从连接表中返回
id
列,但不是
products


1
投票

如果您或任何人想要从像 products 这样的表中获取两个或更多属性,基于属性的独特特征,只有此解决方案可以帮助您实现 Rails >= 5.1

distinct_products = Product.select("DISTINCT ON (category) *")

# it's an active record relation class.
> distinct_products.class
=> Product::ActiveRecord_Relation

注意。 不要在

.pluck()
上使用
distinct_products
。它将从 products 表中重新选择,并且独特的功能将不再起作用。


0
投票

需要获得唯一的输出,并且尝试“uniq”方法未成功。尝试了这里发布的几种解决方案,但均未成功。我正在使用 devise,它使我可以访问

current_user
方法并使用两个表,其中一个是联接(一个项目 has_many :things)。

这个解决方案最终对我有用:

@current_user.things.select(:item_fk).distinct.each do |thing|
 <%= thing.item.attribute %>
<% end %>
© www.soinside.com 2019 - 2024. All rights reserved.