我想知道是否有更优雅的方式来实现我的目标。
所有用户:[1,2,3]
所有产品:[4,5,7]
查看历史记录[[1, 7],[2, 4], [1, 4], [1, 4]]
[[USER_ID, PRODUCT_ID], [USER_ID, PRODUCT_ID], ..]
{
1:{
4:2,
5:0,
7:1,
},
2:{
4:1,
5:0,
7:0,
},
3:{
4:0,
5:0,
7:0,
}
}
{
USER_ID:{
PRODUCIT_ID: view_count
...
},
USER_ID:{
PRODUCIT_ID: view_count,
...
},
}
答案 0 :(得分:1)
GAITracker.h
答案 1 :(得分:0)
使用Ruby 1.8.7尝试了一个简短的解决方案。
view_history = [[1, 7],[2, 4], [1, 4], [1, 4]]
Hash[*view_history.group_by(&:first).
map { |k,v| [k,Hash[*v.group_by(&:last).
map { |k,v| [k,v.size] }.
flatten]] }.
flatten]
#=> {1=>{7=>1, 4=>2}, 2=>{4=>1}}
该解决方案不包含没有任何视图的产品。
答案 2 :(得分:0)
这是我的答案,但看起来很复杂
all_products = Product.all.pluck(:id).map{|c|[c,0]}.to_h
collaborative_matrix = view_history.group_by{|c| c.first}.collect do |user_id, raw_view_history|
view_history = raw_view_history.collect{|c|c.last}
.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
{
user_id => view_history.merge(all_products) { |key, v1, v2| [v1, v2].max }
}
end