如何从表格列中获取唯一值?例如,我有这个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%>
如何从表格列中获取唯一值?例如,我有这个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%>
还有两种方式:
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
已被弃用。
User.uniq.pluck(:source)
会产生 SELECT DISTINCT "users"."source" FROM "users"
的查询语句,因此我认为它不会将所有记录加载到 Ruby 数组中。 - Rafael OliveiraProducts.distinct.pluck(:category)
。 - davegson我认为你可以这样做:
<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>
来源: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
这将在数据库服务器上完成所有的工作,结果是一个简单的数组。
<% Product.distinct(:category).pluck(:category).each do |category|
<%= category %>
<% end %>
Rails 会生成可以在任何数据库上运行的 SQL(例如 Postgres、MySQL 等)。
SELECT DISTINCT "products"."category" FROM "products"
我建议使用Products.all.distinct.pluck(:category)
,因为自Rails 5以来,uniq
已经被弃用,并且在Rails 5.1中将被移除。
Product.group(:category)
Product.group(:category).each { |p| p.name }
对于PostgreSQL
<% 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
列)
distinct_products = Product.select("DISTINCT ON (category) *")
# it's an active record relation class.
> distinct_products.class
=> Product::ActiveRecord_Relation
注意:不要在distinct_products
上使用.pluck()
。这将重新从products表中进行选择,导致去重功能失效。我需要获取唯一的输出,尝试使用“uniq”方法但没有成功。尝试了这里发布的几个解决方案,但都没有成功。我正在使用Devise,它使我可以访问current_user
方法,并且正在使用两个表格,其中一个是连接(一个项目有多个:things)。
最终,这个解决方案对我起作用:
@current_user.things.select(:item_fk).distinct.each do |thing|
<%= thing.item.attribute %>
<% end %>