【问题标题】:Rails Join Table with ArrayRails 用数组连接表
【发布时间】:2013-02-28 14:09:17
【问题描述】:

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

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

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

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

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

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails arrays ruby join


    【解决方案1】:

    所以,我不确定你想在哪里以及如何显示建议,但可以这样说:

    我假设您像这样创建了 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
    

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

    【讨论】:

    • 哦!我刚看到这个!我会看看。也许这对我来说比 gem 更容易实现。
    • 我认为这是一个非常简单的方法。如果我没有正确执行某些操作,只需在数组上搜索 intersect 和 - 方法,您就会很容易找到解决方案。干杯:)
    【解决方案2】:

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

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

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

    Recommendable 是最近更新的,但在赞成票和反对票方面也有更多的作用。不过,您可以将“最喜欢”的产品视为赞成票,如果您愿意,也可以这样使用它。

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

    【讨论】:

    • 感谢您的快速回复!我会检查这些。我现在只需要一些非常简单的东西。我知道我可能没有找到正确的东西。再次感谢,非常感谢!
    • 哈哈,在我开始写这么长的答案之前,我不认为有这样的宝石。谈论重新发明轮子:)
    • 你和我都是@Zippie。我的“推荐引擎”都写在记事本上了,哈哈。
    【解决方案3】:

    执行此操作的一种简单方法是仅使用您创建的连接模型(收藏夹)来获取该 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
    

    【讨论】:

    • 谢谢肖恩!是的,我最初肯定会为了易于执行而不是最佳性能。只是在寻找概念证明。下课后我将有机会检查一下。非常感谢!
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多