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

时间:2013-12-07 07:40:06

标签: ruby-on-rails activerecord

这个问题与此问题相反:How to determine table name within a Rails 3 model class

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

感谢。

4 个答案:

答案 0 :(得分:20)

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

"table_name".classify

或实际获得班级名称:

"table_name".classify.constantize

答案 1 :(得分:5)

怎么样:

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]

答案 2 :(得分:1)

检查ruby API http://apidock.com/rails/String/constantize

constantize方法会将您的字符串转换为常量

由于您的表名称类似于job_applications,您需要将其转换为“JobApplication”,因此请查找受支持的humanize, titleizeclassify方法。

答案 3 :(得分:0)

更好的方法是反过来,加载所有模型并提取它们的表名。

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)