在我的模型中Rails未定义的方法

时间:2016-12-30 16:49:38

标签: ruby-on-rails ruby

我正在使用cassandra宝石。 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时会显示错误:

  

未定义的方法`connect'代表nil:NilClass

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

我想在变量上保存连接,因此不需要为每个请求建立新连接。

1 个答案:

答案 0 :(得分:2)

看起来@cluster是零,所以它没有被正确初始化。

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