0

我尝试搜索,但找不到任何东西。请注意,我可能一直在寻找错误的东西。

所以,我的问题是关于 Rails 中的连接表。

我计划拥有用户和书籍以及将用户链接到书籍的连接表收藏夹。

所以,我最初的想法是收藏夹表应该有 user_id 和 book_id。

不过,我也想提供一些建议。因此,如果 user1 喜欢书籍 1、2、3、4,而 user2 喜欢书籍 1、2、3、4、5;我希望能够向 user1 推荐第 5 本书。

我在想,有一个带有 user_id 的表,然后是一个包含他们最喜欢的书的数组,这对于找出适当的建议是最容易的。

所以,我的问题有两个。首先,我需要两张桌子吗?一个连接表,另一个用于带有数组的表?或者这两个可以/应该是一样的吗?其次,这是设置这一切的最佳方式吗?我是自学成才的,所以我很可能会遗漏一些非常基本的东西。

非常感谢您的帮助!

4

3 回答 3

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

并且该方法应该返回包含用户收藏但当前用户尚未收藏的所有书籍的数组

于 2013-03-12T21:02:43.083 回答
2

要回答您的第一个问题:您正在寻找一个单一的标准连接表。包含具有相同信息的不同表示的另一个表(或另一列)将证明您难以保持一致,并且可能不会像您想象的那样帮助您。

原因是问题二的答案:这里有很多非常棒的推荐引擎可以为您完成所有这些工作!

最大的一个是Recommendify,但它已经有大约一年没有活跃了。我在一个项目中使用它,发现它非常令人满意:它速度很快,而且根据我的经验,结果似乎是准确的。

Recommendable是最近更新的,但也更适用于 upvotes 和 downvotes。尽管如此,您仍然可以将产品的“最喜欢”视为赞成票,并且如果您愿意,可能会这样使用它。

如果这些都不符合您的需求,您可以查看RubyToolbox 的推荐引擎列表

于 2013-03-12T20:53:56.673 回答
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
于 2013-03-12T21:03:10.720 回答