2013-05-06 41 views
2

我一直在試圖找到一個理想的解決方案,以在mongoid中跟隨和發現這一點。 HABTM mongoid following/followerrails mongoid follow/unfollow指導和優化

出於某種原因,林不知道如何優化這和這個職位是早在2011年

如果以這種方式實現,追隨者和以下ID保存在數組中。這對於少量的追隨者來說很好,可能很快。但想象一下,如果有成千上萬的追隨者,那麼如果你每次搜索數組中的一個項目,通過數組可能不是最快的方法。

根據本教程鏈接,http://ruby.railstutorial.org/chapters/following-users 以下建議放在關係表中,這是快速查找時,你只需要檢查關係。

我對所有人的問題是下面的代碼非常適合mongoid優化?我需要一些專家建議,當有大量追隨者時,你們是如何處理關係的。

謝謝。

class User 
    include Mongoid::Document 

    field :name, type: String 

    has_and_belongs_to_many :following, class_name: 'User', inverse_of: :followers, autosave: true 
    has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following 

    def follow!(user) 
    if self.id != user.id && !self.following.include?(user) 
    self.following << user 
    end 
end 

    def unfollow!(user) 
    self.following.delete(user) 
end 
end 

回答

0

您可以創建一個實際Follow模型(也因此將在其自己的收藏被持久化)是這樣的:

class Follow 
    include Mondoid::Document 

    belongs_to :user 
    belongs_to :followed_user, class_name: 'User' 

end 

class User 
    include Mongoid::Document 

    field :name, type: String 
    has_many :follows 

    def follow!(user) 
    follows.create(followed_user: user) 
    end 

    def unfollow!(user) 
    follows.where(followed_user_id: user.id).destroy 
    end 
end 
+0

非常感謝,我會試試這個...可能這是最好的方式比保持它在陣列中。將標記在回答一次我驗證它。 – Axil 2013-05-07 02:55:46

+0

還有一件事我需要檢查,對於用戶刪除,我不知道在此代碼中有驗證以銷燬用戶的所有後續條目?還需要驗證這個...可能不是。 – Axil 2013-05-07 03:36:08

+0

它工作的代碼,但在用戶刪除,它不刪除後續條目。應該做一些清理工作。這是有點回答...謝謝。 – Axil 2013-05-07 05:02:37

0

添加依賴於用戶毀滅的完整性:

class Follow 
    include Mondoid::Document 

    belongs_to :user 
belongs_to :followed_user, class_name: 'User' 

    end 

class User 
    include Mongoid::Document 

    field :name, type: String 
    has_many :follows, :dependent => :destroy 

    def follow!(user) 
    follows.create(followed_user: user) 
    end 

    def unfollow!(user) 
    follows.where(followed_user_id: user.id).destroy 
end 

結束