我附加了各种类型的节目集合,以便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存在的任何关系。
答案 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 }}