如何在Rails中显示3个最常见的属性数组

时间:2015-03-19 14:38:42

标签: ruby-on-rails ruby arrays hash

我有一个电影应用程序,它由以下模型组成:ActorMoviesGenre。我创造了一个多对多的协会,其中演员拥有并属于许多电影,反之亦然。

class Actor < ActiveRecord::Base
    has_many :movies, through: :actor_movies
    has_many :actor_movies
end

class ActorMovie < ActiveRecord::Base
    belongs_to :actor
    belongs_to :movie
end

class Movie < ActiveRecord::Base
    belongs_to :genre

    has_many :actors, through: :actor_movies
    has_many :actor_movies
end

我也这样做,以便每部电影都有自己的类型:

class Genre < ActiveRecord::Base
    has_many :movies
end

在演员的show页面上,我想展示他们已经出演的3种最常见的电影类型。这显然是基于他们的电影类型。我想弄清楚的是如何将这些电影(及其相关类型)放在某种类型的阵列中并执行动作以产生前面提到的结果。

控制器

def show
  @actor = Actor.find(params[:id]
  @movies = @actor.movies
end

例如,我有一个演员,他的电影类型包括动作,喜剧,戏剧,惊悚片,科幻片等。在做一些研究时,我发现了Rubular方法来创建一个哈希使用inject的第二个答案{{1}}的数组。

我会在这个rails项目中做类似的事情吗?

2 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

class Actor < ActiveRecord::Base
  # rest of your code

  has_many :genres, through: :movies

  def common_genres(limit=3)
    genres
      .group("genres.id")
      .order("count(genres.id) DESC")
      .limit(limit)
  end
end

您可以像以下一样使用它:

actor = Actor.first

actor.common_genres.each do |genre|
  p genre.name
end

使用提供的方法,您可以根据需要提取尽可能多的 Genre

actor.common_genres(5)

希望有所帮助!

答案 1 :(得分:0)

这样的事情:

@top_movies = @actor.movies.group(:genre).count

那应该输出如下内容:

{ 'thriller' => 7, 'comedy' => 12 }

要对该哈希进行排序,您可以这样做:

@top_movies = @actor.movies.group(:genre).count.sort_by { |_, v| -v }.first(3)

编辑:

要回答您的后续问题,您只需在视图中循环浏览该数组:

<% @top_movies.each do |movie| %>
  <%= movie[0] %>
<% end %>