This document provides recommendations for building recommendation systems using Ruby on Rails. It discusses using the acts_as_recommendable gem to add recommendation capabilities based on content, user, or item similarities. It also summarizes challenges encountered with performance, caching, and scaling the recommendations system and potential solutions such as pre-computing recommendations offline, splitting the cache, removing ActiveRecord, and rewriting parts of the algorithm in C.
13. User Has Many Through
Book
Has Many Has Many
UserBooks
Can have score (rating)
14. User
class User < ActiveRecord::Base
has_many :user_books
has_many :books, :through => :user_books
acts_as_recommendable :books, :through => :user_books
end
25. SELECT * FROM quot;usersquot; WHERE (quot;usersquot;.quot;idquot; = 2)
SELECT * FROM quot;booksquot;
SELECT * FROM quot;usersquot;
SELECT quot;user_booksquot;.* FROM quot;user_booksquot; WHERE (quot;user_booksquot;.user_id IN (1,2,3,4,5,6,7,8,9,10))
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; IN (11,6,12,7,13,8,14,9,15,1,2,19,20,3,10,4,5))
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; IN (20,3,19,6))
All books All user_books
26. Solution
Cache the dataset
Build offline
rake recommendations:build
27. SELECT * FROM quot;user_booksquot; WHERE (quot;user_booksquot;.user_id = 2)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 5)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 4)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 8)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 7)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 2)
SELECT * FROM quot;booksquot; WHERE (quot;booksquot;.quot;idquot; = 1)