我尝试过搜索,但无法找到任何内容。请注意,我可能一直在寻找错误的东西。
所以,我的问题是关于Rails中的连接表。
我计划将用户和图书以及将用户链接到图书的联接表收藏夹。
所以,我最初的想法是,收藏夹表将有user_id和book_id。
但是,我还想提供建议。因此,如果user1喜欢书籍1,2,3,4而user2喜欢书籍1,2,3,4,5;我希望能够向用户1推荐第5册。
我认为拥有一个包含user_id的表格,然后是一个包含他们喜欢的书籍的数组,最容易找到合适的建议。
所以,我的问题是双重的。首先,我需要两张桌子吗?一个连接表和另一个带有数组的表?或者这两者可以/应该相同吗?其次,这是设置这一切的最佳方式吗?我是自学成才的,所以我很可能会遗漏一些非常基本的东西..
非常感谢帮助!
答案 0 :(得分:3)
所以,我不知道你想在哪里以及如何展示这些建议,但我们可以这样说:
我假设您创建了这样的User,Book和Favorite类:
Class User < ActiveRecord::Base
has_many :favorites
has_many :books, :through => :favorites
end
Class Book < ActiveRecord::Base
has_many :favorites
has_many :users, :through => :favorites
end
Class Favorite < ActiveRecord::Base
belongs_to :user
belongs_to :book
end
让我们说每个用户都有自己的个人资料页面(显示操作),每当有用户访问另一个用户的个人资料页面时,您希望显示该建议。
您不必为建议制作任何表格,只需几种方法来计算建议并将其显示给用户。
让我们说,建议一本书,你需要至少有三本你最喜欢的书与其他用户。
用户类中的:
def suggest_books_from?(user)
true if self.books & user.books > 3
end
这会产生交叉,看看你是否与其他用户兼容。 如果您兼容,例如该方法返回true,而不是计算要向他推荐的书籍,因此调用将是这样的:
if current_user.suggest_books_from?(user)
user.books - current_user.books
end
并且该方法应该返回包含用户已收藏的所有图书的数组,但当前用户尚未收藏
答案 1 :(得分:2)
回答您的第一个问题:您正在寻找单个标准联接表。包含相同信息的不同表示的另一个表(或另一列)将难以保持一致,并且可能无法像您想象的那样帮助您。
原因是问题二的答案:这里有很多非常棒的推荐引擎可以为你完成所有这些工作!
最大的一个是recommendify但是大约一年没有活跃。我在一个项目中使用它并发现它非常令人满意:它很快,根据我的经验,结果似乎是准确的。
Recommendable最近更新,但在upvotes和downvotes上也有更多工作。尽管如此,你仍然可以将产品的“最爱”视为一种支持,如果你愿意,也可以像这样使用它。
如果这些都不符合您的需求,您可以查看RubyToolbox's list of recommendation engines。
答案 2 :(得分:0)
执行此操作的一种简单方法是使用您创建的连接模型(收藏夹)来获取该ID数组。从长远来看,它可能不具备高性能,但考虑到应用程序的早期状态,我现在会保持简单并稍后处理性能。
那么,在这种情况下,如果你有这样的东西:
class User < ActiveRecord::Base
has_many :favorites
has_many :books, :through => :favorites
end
class Book < ActiveRecord::Base
end
class Favourite < ActiveRecord::Base
belongs_to :user
belongs_to :book
end
然后你可以为这样的用户获取图书ID:
user = User.first
user.book_ids
我不能说推荐书籍,但看看两个用户没有共同的书籍:
frank = User.first
joe = User.last
frank.book_ids - joe.book_ids # IDs for books Frank has but Joe doesn't
joe.book_ids - frank.book_ids # IDs for books Joe has but Frank doesn't