如何在rails non activerecord模型中从ruby中的实例方法访问类方法

时间:2018-02-24 15:59:48

标签: ruby-on-rails ruby

我有一个非activerecord rails模型:

/usr/share/elasticsearch

为了找到Document,我可以使用:

class Document
  attr_accessor :a, :b
  include ActiveModel::Model

  def find(id)
    initialize_parameters(id)
  end

  def save
    ...
  end

  def update
    ...
  end

  private

  def initialize_parameters(id)
    @a = 1
    @b = 2
  end
end

因此,为了直接获取它,我将find方法更改为

Document.new.find(3)

运行

时出现以下错误
def self.find(id)
  initialize_parameters(id)
end
  

Document:Class

的未定义方法`initialize_parameters'

我该如何做到这一点?

2 个答案:

答案 0 :(得分:3)

你无法从类方法中访问实例方法,为此,你应该实例化你正在使用的类(self)并访问该方法,例如:

def self.find(id)
  self.new.initialize_parameters(id)
end

但是当你将initialize_parameters定义为私有方法时,访问它的方法是使用send来访问该方法并传递id参数:

def self.find(id)
  self.new.send(:initialize_parameters, id)
end

private

def initialize_parameters(id)
  @a = 1
  @b = 2
end

或者只是将initialize_parameters更新为类方法,并删除不再需要的private关键字。

答案 1 :(得分:1)

此:

class Document
  attr_accessor :a, :b

  def self.find(id)
    initialize_parameters(id)
  end

end

不是试图从实例方法"访问类方法"正如你的标题所述。它试图从类方法访问(不存在的)类方法。

塞巴斯蒂安所说的一切都是现实。

然而,我想我会问:'你真正想做什么?'为什么当ruby已经为您提供initialize_parameters时,您可以initialize覆盖您心中的内容? IMO,它看起来应该更像:

class Document
  attr_accessor :a, :b, :id

  class << self

    def find(id)
      new(id).find
    end

  end

  def initialize(id)
    @a = 1
    @b = 2
    @id = id
  end

  def find
    # if you want you can:
    call_a_private_method
  end

private

  def call_a_private_method
    puts id
  end

end