2015-08-30 91 views
0

快速的問題。最有效的活動記錄查詢來查看記錄是否是最愛?

我有一個Rails應用程序,它有一個Book模型。

我也有一個「最喜歡」和「評級」模型。

每本書都可以由用戶收藏,用戶可以對書籍進行評分。

每次書籍被收藏或評分時,都會創建一個新的最愛或評分活動記錄條目。

所以,如果我列出所有的書都在索引視圖,我想要的書模型有一個is_favorited attribue它,看如果登錄用戶當前的收藏吧...這樣

class book 




    def favorite 
    isFavorite = false 
    if User.current_user 
     favorite = Favorite.where(:attraction_id => self.id, :user_id => User.current_user.id) 
     if favorite.length > 0 
     isFavorite = true 
     else 
     isFavorite = false 
     end 
    end 

    return isFavorite 
    end 
end 

我知道這不是最有效的方法。

什麼是正確的方式來做這樣的事情?

謝謝!

+0

一如往常,在代碼中,很多方法對皮膚一隻貓。而最有效率取決於幾件事情,包括負載和書本數量等等。你正在使用哪個數據庫? – trh

+0

我正在使用postgres – striff88

+0

用戶可以有多個收藏夾,或只有一個? –

回答

0

無關的,但是這個代碼:

def favorite 
    isFavorite = false 
    if User.current_user 
     favorite = Favorite.where(:attraction_id => self.id, :user_id => User.current_user.id) 
     if favorite.length > 0 
     isFavorite = true 
     else 
     isFavorite = false 
     end 
    end 

    return isFavorite 
    end 

可能是更好的表述爲:

def favorite 
    return false unless User.current_user 

    favorites = Favorite.where(attraction_id: self.id, user_id: User.current_user.id) 
    favorites.length > 0 
    end 
0

什麼現在你的代碼確實是從數據庫中檢索的所有收藏夾,然後返回的長度陣列。只需詢問count以便查詢立即返回只有的收藏數量好得多。

另外,只需將用戶作爲參數傳遞,就可以將代碼解耦。因此,像這樣:

class book 

    def favorited_by(user) 
    return false if user.nil? 

    Favorite.where(:attraction_id => self.id, :user_id => user.id).count > 0 
    end 

end 

現在,我怎麼會喜歡寫這篇文章,是使用關聯,由於某種原因,你的外鍵被稱作attraction_id,所以假設這是不是一個多態關聯,你可以只寫:

has_many :favorites, foreign_key: :attraction_id 

,然後將代碼變得更清潔:

favorites.where(user_id: user.id).count > 0