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

Ole*_*sko 63 ruby-on-rails unique ruby-on-rails-3

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

ID NAME CATEGORY
1 name1 1st_cat
2 name2 2nd_cat
3 name3 1st_cat
Run Code Online (Sandbox Code Playgroud)

在这里,我想只获得2个值 - 1st_cat和2nd_cat:

<%Products.each do |p|%>
<%=p.category%>
<%end%>
Run Code Online (Sandbox Code Playgroud)

use*_*833 138

还有两种方法:

Products.select(:category).map(&:category).uniq

Products.uniq.pluck(:category)
Run Code Online (Sandbox Code Playgroud)

  • `User.uniq.pluck(:source)`生成`SELECT DISTINCT"users"."source"FROM"users"`所以我不认为它将所有记录加载到ruby数组中. (13认同)
  • 这会将所有产品拉入Ruby数组,而不是在数据库中完成工作. (6认同)
  • 对于``Rails&gt; = 5.1 **''使用`Products.distinct.pluck(:category)` (3认同)
  • 我正在寻找这个:Products.pluck(:category).uniq棒极了!+1 :) (2认同)

Tha*_*son 26

我想你可以这样做:

<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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


jel*_*der 9

这样做可以完成数据库服务器中的所有工作.结果是一个简单的数组.

<% Product.distinct(:category).pluck(:category).each do |category|
    <%= category %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT "products"."category" FROM "products"
Run Code Online (Sandbox Code Playgroud)


Fab*_*Ros 7

我建议使用Products.all.distinct.pluck(:category)因为uniq自rails 5以来已被弃用,它将在rails 5.1上删除


Mar*_*oda 6

试试这个(在rails控制台中)

Product.group(:category)

Product.group(:category).each { |p| p.name }
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于MySql数据库(也可能是sqlite,但在Postgres或MSSQL上肯定不行 (5认同)