【发布时间】:2010-11-17 01:10:37
【问题描述】:
我需要一个包含所有模型(class_names)的列表,这些模型末尾带有“Cube”模式。
示例:
我所有的模型: ModelFoo、ModelBar、ModelBarCube、Mode2BarCube
我需要什么:
['ModelBarCube', 'Mode2BarCube']
【问题讨论】:
标签: ruby-on-rails ruby activerecord
我需要一个包含所有模型(class_names)的列表,这些模型末尾带有“Cube”模式。
示例:
我所有的模型: ModelFoo、ModelBar、ModelBarCube、Mode2BarCube
我需要什么:
['ModelBarCube', 'Mode2BarCube']
【问题讨论】:
标签: ruby-on-rails ruby activerecord
因为除非需要,Rails 不会加载类,因此您必须从文件夹中读取模型。这是代码
Dir.glob(Rails.root + '/app/models/*.rb').each { |file| require file }
@models = Object.subclasses_of(ActiveRecord::Base).select { |model|
model.name[-4..-1] == "Cube"
}
【讨论】:
在 Rails 3 中,您可以将 @models 换成:
@models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort
【讨论】:
对于 Rails 3
@models = ActiveRecord::Base.
descendants.
select{|x| x.name[-4..-1] == "Cube"}
【讨论】:
我在谷歌上搜索如何显示所有 Ralis 模型的答案,这里的答案组合非常有用,谢谢。
所以这里的解决方案组合甚至适用于 Rails 上的 STI 表
#Since Rails doesn't load classes unless it needs them, you must read the models from the folder. Here is the code
Dir[Rails.root.to_s + '/app/models/**/*.rb'].each do |file|
begin
require file
rescue
end
end
models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort
models.each do |model|
print model
print ' '
end
@models = ActiveRecord::Base.descendants.map(&:name)
为您提供所有模型名称,这些名称要么继承自 ActiveRecord::Base,要么是任何现有模型的子类。
【讨论】: