2016-12-30 1 views
1

Ich benutze den Cassandra-Edelstein. http://docs.datastax.com/en/developer/ruby-driver/3.0/features/Schienen undefined Methode in meinem Modell

In meinem Modell Ich mache folgendes:

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 

Aber wenn ich die total_users method der Fehler nennen wird angezeigt:

nicht definierte Methode `connect‘ für nil: NilClass

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

I wollte die Verbindung auf einer Variablen speichern, so dass es nicht notwendig ist, für jede Anfrage eine neue Verbindung herzustellen.

Antwort

2

Es sieht aus wie @cluster ist Null, so wurde es nicht richtig initialisiert.

Es isn't a good idea definieren initialize für Rails-Modelle. Sie könnten stattdessen callbacks verwenden.

Wenn ich es richtig verstehe, ist die Sitzung nicht auf dem Benutzer abhängig und konnte für User Klasse statt User Instanzen definiert werden:

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 ||= Verwendung bedeutet, dass @session einmal initialisiert werden und gehalten im Cache danach:

@x ||= 1 
@x ||= 2 
@x ||= not_even_called 
puts @x 
#=> 1 
Verwandte Themen