2016-12-30 3 views
1

私はcassandra gemを使用しています。私のモデルでは http://docs.datastax.com/en/developer/ruby-driver/3.0/features/私のモデルでレールが未定義のメソッド

私は次のことをやっている:

class User < ApplicationRecord 
    require 'cassandra' 

    def initialize 
    @cluster = Cassandra.cluster 
    end 

    def session 
    @cluster.connect('capsula') 
    end 

    def total_users 
    result = session.execute("SELECT * FROM users") 
    result.size 
    end 

end 

しかし、ときに私はエラーが表示されtotal_users methodを呼び出す:

を未定義のメソッド `nilのために「接続:NilClass

def session 
    @cluster.connect('capsula') 
end 

I変数に接続を保存して、各要求に対して新しい接続を行う必要はありませんでした。

答えて

2

@clusterがnilなので、正しく初期化されていないようです。

isn't a good ideaを定義して、Railsモデル用にinitializeを定義します。代わりにcallbacksを使用できます。

私はそれを正しく理解していれば、セッションはユーザーに依存せず、代わりにUserインスタンスでUserクラスに定義することができます

class User < ApplicationRecord 
    require 'cassandra' 

    class << self 
    def cassandra_session 
     @session ||= Cassandra.cluster.connect('capsula') 
    end 
    end 

    def total_users 
    result = User.cassandra_session.execute("SELECT * FROM users") 
    result.size 
    end 
end 

@session ||=を使用すると、@sessionは一度初期化して保管されることを意味しますその後のキャッシュ:

@x ||= 1 
@x ||= 2 
@x ||= not_even_called 
puts @x 
#=> 1 
関連する問題