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:如何从列中获取唯一值的主要内容,如果未能解决你的问题,请参考以下文章

Rails:从列中选择唯一值

Rails:从列中选择唯一值

选择总和列,然后从列中获取最小值

T-SQL,从列中的xml获取值

Sqlite3 从列中具有相似值的行获取数据

PowerBI:根据度量过滤器从列中获取值