【问题标题】:In ruby on rails, how to group records by tag when records have multiple tags在ruby on rails中,当记录有多个标签时如何按标签对记录进行分组
【发布时间】:2011-12-15 20:41:07
【问题描述】:

我正在使用 Rails 3.0 和acts_as_taggable_on gem。我有一个糖果模型,糖果可以有多个口味标签。比方说

Candy1.tags #['apple', 'orange']
Candy2.tags #['orange', 'banana']
Candy3.tags #['apple', 'kiwi']

我想要一个标签列表以及它们下面的相关糖果,如下所示:

苹果

  • 糖果1
  • 糖果3

橙色

  • 糖果1
  • 糖果2

...等等。

我试过了

Candy.all.group_by{ |candy| candy.tags }

但这会将标签数组视为单个实体,返回如下内容:

['苹果','橙色']

  • 糖果1

['橙色','香蕉']

  • 糖果2

缺少 group_by_each 方法,最好的方法是什么? Another Stack Overflow question 解释了如何使用简单的哈希在内存中执行此操作,但我想知道是否有更面向数据库的方式来使用 ActiveRecord 关联。

【问题讨论】:

    标签: ruby-on-rails group-by acts-as-taggable-on


    【解决方案1】:

    您可以遍历糖果并将它们存储在标签的哈希基础上:

    grouped = {}
    Candy.all.each do |candy|
      candy.tags.each do |tag|
        grouped[tag] ||= []
        grouped[tag] << candy
      end
    end
    

    最后你会得到:

    {'apple' => [candy1, candy2], 'orange' => [] ...}
    

    希望对你有帮助

    【讨论】:

    • 第一个也是最简单的答案——正是我需要的。谢谢!
    【解决方案2】:
    candies = Candy.all.inject({}) do |memo, candy|
      candy.tags.each do |tag|
        memo[tag] ||= []
        memo[tag] << candy
        memo
      end
    end
    

    现在candies 是这样的哈希:

    {
      'apple' => [Candy1, Candy3],
      'orange' => [Candy1, Candy2],
      ...
    }
    

    你可以很好地迭代:

    candies.each do |key, value|
      puts "Candy tag: #{key}"
      value.each do |candy|
        puts " * #{candy}"
      end
    end
    

    【讨论】:

      【解决方案3】:

      rails api 文档中 group_by 用于收集可枚举。我认为你需要尝试一个更经典的数组迭代器,因为你有字符串数据

      在views/candy/index.html.erb中

          <% @candys.each do |candy| %>
          <%= candy.name %>
          <% end %>
      
          <%for tag in candy.tags %>
           <li> <%= tag.name(or flavor %> </li>    #tag.name_attribute
          <% end %>
      
        <% end %>
      

      让我知道它是否有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多