我有一个电影应用程序,它由以下模型组成:Actor
,Movies
,Genre
。我创造了一个多对多的协会,其中演员拥有并属于许多电影,反之亦然。
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项目中做类似的事情吗?
答案 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 %>