如何按数组中的单个元素进行分组

时间:2015-08-09 16:13:12

标签: ruby-on-rails ruby

我附加了各种类型的节目集合,以便Show.first.genres返回['horror','scifi',etc]

我的目标是按照独特的流派计算用户平均分数。问题是如果我做Show.group(:genres),我会得到整套流派的结果:

['horror','scifi']=>[list of entries]
['horror','gore']=>[list of entries]

我宁愿得到各种类型的恐怖主义,所有元素与科幻等等。任何想法?

以下是一些相关的架构信息:

create_table "animes", force: :cascade do |t|
end

create_table "animes_genres", id: false, force: :cascade do |t|
 t.integer "anime_id", null: false
 t.integer "genre_id", null: false
end

create_table "genres", force: :cascade do |t|
 t.string "name"
end

create_table "library_entries", force: :cascade do |t|
end

这些都是来回链接的,我通常可以访问通过ActiveRecord存在的任何关系。

3 个答案:

答案 0 :(得分:1)

或者以更Railsish的方式,你应该从Genre开始并做类似的事情:

Genre.all.map{|g| [g, g.shows] }.to_h

答案 1 :(得分:0)

如果ActiveRecord Association指向两个方向,那么您应该可以从类型模型的角度来看问题。

Genre.find('space opera').shows

答案 2 :(得分:0)

我不确定这是否是您要找的,但如果Show.group(:genres)返回Hash [array of genres] => [array of entries],您可以将其转换为Hash genre => [array of entries],通过这样做:

by_genres = Show.group(:genres)
by_genre = {}
by_genre.default = []
by_genres.each{|ks,vs| ks.each{|k| by_genre[k] += vs }}

或者,如果您只想要计数:

by_genres = Show.group(:genres)
count_genre = {}
count_genre.default = 0
by_genres.each{|ks,vs| ks.each{|k| count_genre[k] += vs.size }}