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

时间:2011-12-03 18:14:31

标签: ruby-on-rails ruby-on-rails-3 unique

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

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%>

8 个答案:

答案 0 :(得分:131)

还有两种方式:

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

Products.uniq.pluck(:category)

答案 1 :(得分:26)

我认为你可以这样做:

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

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

答案 2 :(得分:9)

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

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

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

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

答案 3 :(得分:7)

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

答案 4 :(得分:6)

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

Product.group(:category)

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

答案 5 :(得分:2)

对于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

答案 6 :(得分:0)

需要获得独特的输出并且正在尝试使用&#39; uniq&#39;方法失败。试过这里发布的几个解决方案失败了。我使用了devise,它允许我访问current_user方法并使用两个表,一个是连接(一个项目has_many:东西)。

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

@current_user.things.select(:item_fk).distinct.each do |thing|
 <%= thing.item.attribute %>
<% end %>

答案 7 :(得分:0)

如果您或任何人想从诸如 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 表中重新选择,并且独特的功能将不再起作用。