Rails:如何从列中获取唯一值
Posted
技术标签:
【中文标题】Rails:如何从列中获取唯一值【英文标题】:Rails: how can I get unique values from column 【发布时间】:2012-01-12 06:40:49 【问题描述】:如何从表中的列中获取唯一值? 例如,我有这个 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.group("category_id") 进行分组 以下所有可能的方式 - 需要注意的是 Products.uniq.pluck(:category) 是最有效的方式 只是事后诸葛亮;如果您的模型名称是复数,那么就 Rails 的观点而言,您做错了。 【参考方案1】:另外两种方式:
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
是deprecated。
【讨论】:
我正是在寻找这个:Products.pluck(:category).uniq 太棒了! +1 :) 这会将所有产品拉到一个 Ruby 数组中,而不是在数据库中完成工作。 @superluminary 将所有产品拉入一个 Ruby 数组,而不是让数据库做推荐的工作?User.uniq.pluck(:source)
产生 SELECT DISTINCT "users"."source" FROM "users"
所以我认为它不会将所有记录加载到 ruby 数组中。
对于 Rails >= 5.1 使用 Products.distinct.pluck(:category)
【参考方案2】:
我认为你可以这样做:
<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>
来源:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
【讨论】:
我自己是 Rails 新手(现在只是在学习教程 ;-))我用谷歌搜索了它。 仅在您想要 1 列时有效,其他列不被选中【参考方案3】:这会在数据库服务器中完成所有工作。结果是一个简单的数组。
<% Product.distinct(:category).pluck(:category).each do |category|
<%= category %>
<% end %>
Rails 将生成适用于任何数据库(Postgres、mysql 等)的 SQL。
SELECT DISTINCT "products"."category" FROM "products"
【讨论】:
【参考方案4】:我建议使用Products.all.distinct.pluck(:category)
,因为uniq
自 Rails 5 以来已被弃用,它将在 Rails 5.1 上删除
【讨论】:
【参考方案5】:试试这个(在 Rails 控制台中)
Product.group(:category)
Product.group(:category).each |p| p.name
【讨论】:
这只适用于 MySql 数据库(也可能是 sqlite,但在 Postgres 或 MSSQL 上绝对不行 在 sqlite 上工作 你必须: Product.select(:category).group(:category) 让它在 Postgresql 上工作(我猜是 MSSQL)。【参考方案6】:对于 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
)
【讨论】:
投了赞成票,因为当您需要整个活动记录关系而不是提取值数组时,这个解决方案对我有用。【参考方案7】:需要获得唯一的输出,但尝试使用 'uniq' 方法失败。尝试了此处发布的几种解决方案均未成功。我正在使用设计,它使我可以访问 current_user
方法并使用两个表,一个是连接(一个项目 has_many :things)。
这个解决方案最终对我有用:
@current_user.things.select(:item_fk).distinct.each do |thing|
<%= thing.item.attribute %>
<% end %>
【讨论】:
【参考方案8】:如果您或任何人想要从 products 等表中获取两个或多个属性,基于属性的独特特征,只有此解决方案才能帮助您导轨 >= 5.1
distinct_products = Product.select("DISTINCT ON (category) *")
# it's an active record relation class.
> distinct_products.class
=> Product::ActiveRecord_Relation
注意不要在distinct_products
上使用.pluck()
。它将从 products 表中重新选择,并且独特的功能将不再起作用。
【讨论】:
以上是关于Rails:如何从列中获取唯一值的主要内容,如果未能解决你的问题,请参考以下文章