【问题标题】:Rails: how can I get unique values from columnRails:如何从列中获取唯一值
【发布时间】: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 的观点而言,您做错了。

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


【解决方案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#uniqdeprecated

【讨论】:

  • 我正是在寻找这个: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 新手(现在只是在学习教程 ;-))我用 Google 搜索了它。
  • 仅在您想要 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 表中重新选择,并且独特的功能将不再起作用。

        【讨论】:

          猜你喜欢
          • 2019-05-26
          • 1970-01-01
          • 1970-01-01
          • 2022-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多