Ruby on Rails常量化方法

gke*_*epa 1 ruby model ruby-on-rails

我在模型中遇到以下问题:

class Search < ActiveRecord::Base
  #search different system user by dn
  def self.gets(sys, dn)
    sys.constantize.search(dn)
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以看到,目的是传递不同的模型名称,sysdn在这些特定模型中进行搜索。但是,我constantize在Ruby中进行了搜索,看不到有关此用法的任何详细说明。

Seb*_*lma 5

Rails文档(因为常量化是一种Rails方法)说:

尝试查找具有参数字符串中指定名称的常量。

例如,如果您的应用程序中有一个名为Foo的模型,则可以将常量化方法应用于包含确切词Foo的字符串,它将为您提供该模型的新对象。请注意,这必须大写,因为Rails可以在您的模型中使用,如果引用不正确,则会出现NameError错误:

NameError: wrong constant name foo
Run Code Online (Sandbox Code Playgroud)

它是如何做到的?如果转到方法定义,或者在使用该方法时遇到错误,则会看到指向的源activesupport-5.1.5/lib/active_support/inflector/methods.rb:269:in 'const_get',即方法定义和错误源。

在两种情况下,该方法根据作为参数接收的内容在内部进行处理,您将看到Object.const_get(string)Ruby(纯)处理“常量”的方式,这与

Object.const_get('Foo') # Foo(...)
Object.const_get('foo') # NameError: wrong constant name foo
Run Code Online (Sandbox Code Playgroud)

如果想实施这种方便的方法,可以看看几年前Gavin Miller的帖子