如何从表名中查找模型类?

Jug*_*ang 9 activerecord ruby-on-rails

这个问题与此问题相反:如何在Rails 3模型类中确定表名.

我的目的是查看Rails项目数据库,并尝试找出项目所涉及的所有可能的模型类.我有一些线索,比如从AR连接获取表名列表等.但是到table_name - >模型类映射.我不知道.

谢谢.

Aus*_*Lin 22

在Rails中调用此方法的方法是#classify(http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-classify).如果您可以使用Ruby(或Rails本身),请执行以下操作:

"table_name".classify
Run Code Online (Sandbox Code Playgroud)

或实际获得类名:

"table_name".classify.constantize
Run Code Online (Sandbox Code Playgroud)

  • 你如何处理命名空间?IE浏览器.`'admin_users'` - >`Admin :: User` (2认同)

est*_*ani 8

更好的方法是反其道而行之,加载所有模型并提取它们的表名称。

Rails 6.x / Zeitwerk

# load all clases
Zeitwerk::Loader.eager_load_all

# get all named classes extending ApplicationRecord
all_models = ObjectSpace.each_object(Class).select { |c| c < ApplicationRecord}.select(&:name)

# build the index
model_by_table_name = all_models.index_by(&:table_name)
Run Code Online (Sandbox Code Playgroud)


小智 7

怎么样:

def index_by_table_name
  @index_by_table_name ||= ActiveRecord::Base.descendants.reject(&:abstract_class).index_by(&:table_name)
end

klass = index_by_table_name[table_name]
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确的答案,因为 @Austin 的答案适用于字符串而不是实际模型。如果模型有自定义 table_name 怎么办?这个解决方案已经涵盖了它。 (2认同)