红宝石中的私有类方法链接

时间:2018-06-20 12:05:32

标签: ruby-on-rails ruby activerecord

如何在ruby中链接私有类方法?

class Foobar
  private_class_method def self.one
    where(one: true)
  end

  private_class_method def self.two
    where(two: true)
  end

  def self.three
    one.two
  end
end

Foobar.three产生undefined method "two" for #<ActiveRecord::Relation>

为什么会发生这种情况,并且有解决方法来实现我的愿望?

3 个答案:

答案 0 :(得分:4)

实际上,由于私有方法,它不起作用。

很遗憾,没有protected_class_method

所以我建议您采用这种方法:

class Foobar
  class << self
    def three
      one.two
    end

    protected 
    def one
      where(one: true)
    end

    def two
      where(two: true)
    end
  end
end

答案 1 :(得分:1)

因此,我发现了为什么实际上会发生此错误消息:私有类方法在存在接收方的情况下无法调用。

调用one会导致ActiveRecord :: Relation,并且不允许在该关系上调用私有方法,从而导致给定的错误。

有一个小的解决方法可以使它工作:

def self.three
  one.merge(two)
end

通过分别调用一个和两个并将其与ActiveRecord merge method

合并,本接收器消失了。

答案 2 :(得分:0)

#<ActiveRecord::Relation>的未定义方法“ two”出现此消息是因为where(one: true)将在对象数组而不是1个对象中给出结果,因此在self.three中,我们应循环调用。 / p>

def self.three
    one.map{|x| x.two}
   # or 
   #one.map(&:two)
  end