如何在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>
为什么会发生这种情况,并且有解决方法来实现我的愿望?
答案 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