2013-03-12 79 views
0

我试过搜索,但无法找到任何东西。请注意,我可能一直在寻找错误的东西。Rails与阵列连接表

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

我打算让用户和书籍以及将用户链接到书籍的连接表收藏夹。

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

但是,我想也提供建议。所以,如果user1喜欢书籍1,2,3,4和user2喜欢书籍1,2,3,4,5;我希望能够向用户1推荐书5。

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

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

非常感谢帮助!

回答

2

要回答你的第一个问题:你正在寻找一个单一的标准连接表。将另一张表格(或另一列)与相同信息的不同表现形式相结合,对于您保持一致并很可能无法像您想象的那样帮助您,将会很困难。

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

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

Recommendable更近期更新,但也更多地对upvotes和downvotes起作用。尽管如此,你可以把产品的“最喜欢的”当作upvote来使用,如果你愿意的话,可能会这样使用它。

如果这些都不符合您的需求,您可以查看RubyToolbox's list of recommendation engines

+0

感谢您的快速回复!我会检查出来的。我现在只需要一些非常简单的东西。我知道我可能不是在寻找正确的东西。再次感谢,非常感谢! – jon 2013-03-12 20:59:31

+0

哈哈,在我开始写这么长的回答之前,我并不认为有这样的宝石。谈论重塑轮子:) – Zippie 2013-03-12 21:04:00

+1

你和我都@Zippie。我有我的“推荐引擎”全部在我的记事本上画出来,哈哈。 – jon 2013-03-12 21:08:27

3

所以,我不知道在何处以及如何做你想要显示的建议,但可以说,它是这样的:

我假设你所做的用户,图书和收藏类是这样的:

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 

可以说每个用户都有他的个人资料页面(显示操作),并且每次有用户转到其他用户的个人资料页面时,都希望显示建议。

您不必为建议制作任何表格,只需几种方法来计算建议并将其显示给用户。

比方说,为了推荐一本书,您至少需要拥有三本您喜欢的书。

在User类:

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 

和方法应该返回你,包含了所有的书籍,用户数组已收藏,但当前用户尚未收藏

+0

哦!我刚看到这个!我会看看。也许这对我来说比宝石更容易实现。 – jon 2013-03-12 21:09:31

+0

我认为这是一个非常简单的方法。如果我没有正确地执行某些操作,只需在数组中使用相交和'-'方法,您就可以轻松找到解决方案。欢呼:) – Zippie 2013-03-12 21:15:26

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 

然后,你可以买到书IDS的用户,像这样:

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 
+0

谢谢肖恩!是的,我肯定会在最初的时候为了简化执行而优化性能。只是寻找概念证明。我会在我的课后有机会检查一下。非常感谢! – jon 2013-03-12 21:12:23