在 ruby​​ on Rails 中,当记录有多个标签时如何按标签对记录进行分组

发布于 2024-12-21 14:00:04 字数 836 浏览 3 评论 0原文

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

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

我想要一个标签列表,其下方有相关糖果,如下所示:

Apple

  • Candy1
  • Candy3

Orange

  • Candy1
  • Candy2

...等。

我已经尝试过,

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

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

['apple', 'orange']

  • Candy1

['orange', 'banana']

  • Candy2

缺少 group_by_each 方法,最好的方法是什么来完成这个? 另一个 Stack Overflow 问题解释了如何使用简单的哈希在内存中执行此操作,但是我想知道是否有一种更面向数据库的方法来处理 ActiveRecord 关联。

I'm using Rails 3.0 and the acts_as_taggable_on gem. I have a Candy model and candies can have multiple tags for flavors. Let's say

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

I want a list of tags with associated candies below them, like so:

Apple

  • Candy1
  • Candy3

Orange

  • Candy1
  • Candy2

...etc.

I've tried

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

but that treats the array of tags as a single entity, returning something like this:

['apple', 'orange']

  • Candy1

['orange', 'banana']

  • Candy2

Lacking a group_by_each method, whats the best way to accomplish this? Another Stack Overflow question explains how to do this in memory with simple hashes, but I wonder if there's a more database-oriented way to do it with ActiveRecord associations.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱花落人离去 2024-12-28 14:00:04

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

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

最后您将得到:

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

希望这对您有帮助

You can iterate over the candies and store them on a hash base on the tag:

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

At the end you will get:

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

Hope this helps you

定格我的天空 2024-12-28 14:00:04
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
candies = Candy.all.inject({}) do |memo, candy|
  candy.tags.each do |tag|
    memo[tag] ||= []
    memo[tag] << candy
    memo
  end
end

Now candies is a hash like this:

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

Which you can iterate over nicely:

candies.each do |key, value|
  puts "Candy tag: #{key}"
  value.each do |candy|
    puts " * #{candy}"
  end
end
情深如许 2024-12-28 14:00:04

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 %>

有字符串数据让我知道它是否有效

In rails api documentation that group_by is for collecting enumerable. I think you need to try a more classic array iterator like the following since you've strings data

in 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 %>

Let me know if it works

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文