如何从表中的列中获取唯一值? 例如,我有这个产品表:
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
已被 弃用。
我认为你可以做到这一点:
<% 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 将生成适用于任何数据库(Postgres、MySQL 等)的 SQL。
SELECT DISTINCT "products"."category" FROM "products"
我建议使用
Product.all.distinct.pluck(:category)
,因为 uniq
自 Rails 5 起已被弃用,并且将在 Rails 5.1 上删除
尝试这个(在 Rails 控制台中)
Product.group(:category)
Product.group(:category).each { |p| p.name }
对于 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
)
如果您或任何人想要从像 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 表中重新选择,并且独特的功能将不再起作用。
需要获得唯一的输出,并且尝试“uniq”方法未成功。尝试了这里发布的几种解决方案,但均未成功。我正在使用 devise,它使我可以访问
current_user
方法并使用两个表,其中一个是联接(一个项目 has_many :things)。
这个解决方案最终对我有用:
@current_user.things.select(:item_fk).distinct.each do |thing|
<%= thing.item.attribute %>
<% end %>