从对象列表中获取关联对象的Activerecord列表

时间:2010-01-17 18:49:51

标签: ruby-on-rails activerecord

我对Rails相当新,所以如果这是一个愚蠢的问题我会道歉。我试着在网上寻找答案,但我对术语并不十分肯定,所以我发现很难得到答案。

基本上,我有两个模型'Group'和'Category'。组has_one类别,类别belongs_to组。我正在尝试做的是从一个组列表中获取一个类别列表。

这样的事情:

  

@groups = Group.find(:all)
    @categories = @groups。<<插入魔术代码以获取类别>>

所以我可以在视图中做这样的事情:

<% @categories.each do |cat| %>  
    <%= cat.title %>
<% end %>

问题在于我不能让我的小鸡弄清楚魔法码,或者甚至是我需要寻找的东西来学习如何去做。

我尝试过的事情:

@categories = @groups.categories
@categories = @groups.category
@categories = @groups.category.find(:all, :select => 'title')
@categories = Category.find(:all, @groups.categories)
@categories = Category.find(:all, @groups.categories.find(:all, :select => 'title'))

其他各种各样的事情都在上面。

我真的很感激解决方案和/或指向我自己可以学习的地方!

非常感谢

3 个答案:

答案 0 :(得分:4)

这应该快得多

@categories = Category.where(id: @groups.pluck(:category_id))

答案 1 :(得分:3)

我明白了!当你不知道它叫什么时,很难知道要搜索什么。这可以使用纯Ruby轻松完成,使用Array类的map实例方法:

categories = groups.map{|g| g.category}

对此的简写方法是:

categories = groups.map(&:category)

map数组方法为每个元素调用给定的块,并将所有返回值都滚动到数组中。

答案 2 :(得分:1)

我想不出一些魔术代码来插入,但你可以很容易地创建没有这个神奇代码的列表。

@categories = []
@groups.each do |group|
  @categories << @group.category unless @categories.include?(@group.category)
end

@categories现在包含所有类别的列表(每个类别仅包含一次)。