Rails加入表与数组

时间:2013-03-12 20:46:56

标签: ruby-on-rails arrays ruby join

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

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

我计划将用户和图书以及将用户链接到图书的联接表收藏夹。

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

但是,我还想提供建议。因此,如果user1喜欢书籍1,2,3,4而user2喜欢书籍1,2,3,4,5;我希望能够向用户1推荐第5册。

我认为拥有一个包含user_id的表格,然后是一个包含他们喜欢的书籍的数组,最容易找到合适的建议。

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

非常感谢帮助!

3 个答案:

答案 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