小编Sat*_*B V的帖子

什么`&method(:method_ name)`在ruby中意味着什么?

我试图创建一个具有私有类方法的类.我希望这个私有类方法可用于实例方法.

以下是我的第一次尝试:

class Animal
  class << self
    def public_class_greeter(name)
      private_class_greeter(name)
    end

  private
    def private_class_greeter(name)
      puts "#{name} greets private class method"
    end
  end

  def public_instance_greeter(name)
    self.class.private_class_greeter(name)
  end
end
Run Code Online (Sandbox Code Playgroud)

Animal.public_class_greeter('John')工作正常,印刷John greets private class method.

但是,Animal.new.public_instance_greeter("John")抛出一个错误:NoMethodError: private method 'private_class_greeter' called for Animal:Class.

这是预期的,因为调用self.class.private_class_greeter是相同的Animal.private_class_greeter,这显然会引发错误.

在搜索了如何解决这个问题之后,我想出了以下代码:

class Animal
  class << self
    def public_class_greeter(name)
      private_class_greeter(name)
    end

  private
    def private_class_greeter(name)
      puts "#{name} greets private class method"
    end
  end

  define_method :public_instance_greeter, &method(:private_class_greeter)
end
Run Code Online (Sandbox Code Playgroud)

我不太清楚这里发生了什么:&method(:private_class_greeter).

你能解释一下这是什么意思吗? …

ruby metaprogramming

5
推荐指数
1
解决办法
320
查看次数

ActiveRecord::Base.send(:descendants) 不会返回所有模型,除非被触及

更新: Rails 3.2 中不再存在此问题

我正在尝试获取一个包含 Rails 3 应用程序中所有模型的数组。我在尝试:

ActiveRecord::Base.send(:descendants)
Run Code Online (Sandbox Code Playgroud)

对于相同的。类似的讨论发生在以下问题中:是否有一种方法可以获取 Rails 应用程序中所有模型的集合?。正如其中一个答案所指出的,我们需要触摸模型才能显示模型。这正是我面临的问题。

我的 Rails 应用程序中有十几个模型,但是

ActiveRecord::Base.send(:descendants) 
Run Code Online (Sandbox Code Playgroud)

返回一个大小为 2 的数组。该数组只有 User 和 ActiveRecord::SessionStore::Session 模型。在我通过触摸触摸模型之前,我不会获得其他模型,例如调用Comment.new 如何在不触摸所有模型的情况下获得列出的所有模型?

另一条可能有用的附加信息是我正在使用设备进行身份验证。就用户模型而言,也许设计正在以所需的方式做事,而我不会对其他模型做这些事情。

预先非常感谢。

activerecord ruby-on-rails-3

3
推荐指数
1
解决办法
1539
查看次数