2013-03-12 97 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