2013-11-05 57 views
0

我試圖建立在回報率是通過Mongoid使用MongoDB的主對象,但必須通過意見https://github.com/leehambley/opinions/使用Redis的一個喜歡和討厭過程中的應用程序產生的意見。方法不與Mongoid

它有點工作,但是當我在我的對象上運行的方法,我只是得到一個錯誤「未定義的方法`like_by'」,我認爲應該的方式進行自動生成。

我的模型看起來像:

class Punchline 
    include Mongoid::Document 
    include Opinions::Pollable 

    opinions :like, :dislike 

    field :key, type: String 
    field :text, type: String 
    field :won, type: Boolean 
    field :created, type: Time, default: ->{ Time.now } 
    field :score, type: Integer 

    index({ key: 1 }, { unique: true, name: "key_index" }) 
    belongs_to :user 
    embedded_in :joke 
end 

,我跑:

user = User.find(session[:userid]) 
@joke.punchlines.sample.like_by(user); 

但它無法與未定義的方法錯誤:(

我需要的地方初始化意見超越

/config/initializers/opinions.rb

Opinions.backend  = Opinions::RedisBackend.new 
Redis.new(:host => 'localhost', :port => 6379) 
+0

有一個堆棧跟蹤...? – iHiD

回答

0

所以,事實證明,意見並未真正發揮作用。爲什麼是有點超出我的兩個星期的Rails :)

無論如何,事實證明,這是很容易做手工反正特別是因爲我只用了一個喜歡和討厭處理。

我使用的Redis排序集合,其允許一個唯一的密鑰 - 值對的得分。我用+1或-1的分數表示喜歡或不喜歡,然後編碼表示喜歡的對象和值的密鑰作爲用戶ID。

這看起來像:

def like(user) 
    $redis.zadd('joke:'+self.key+':likes', 1, user._id) 
end 

def dislike(user) 
    $redis.zadd('joke:'+self.key+':likes', -1, user._id) 
end 

def numLikes 
    res = $redis.zrangebyscore('joke:'+self.key+':likes',1,1); 
    return res.count 
end 

def numDislikes 
    res = $redis.zrangebyscore('joke:'+self.key+':likes',-1,-1); 
    return res.count 
end 

def likedBy(user) 

    res = $redis.zscore('joke:'+self.key+':likes',user._id) 

    return (res == 1) 

end 

def dislikedBy(user) 
    res = $redis.zscore('joke:'+self.key+':likes',user._id) 

    return (res == -1) 

end