在Rails rake任务中将字符串转换为模型

时间:2012-12-27 15:05:46

标签: ruby-on-rails

我正在尝试在我的所有Rails模型上运行快速rake任务,但无法调用它们,因为这段代码告诉我我无法在字符串上调用方法columns

我尝试了classify而不是camelize,它也没有用,尝试在那里插入一个class_eval,但这似乎不起作用/ don'我对此知之甚多。

task :collect_models_and_field_names => :environment do

models = Dir.glob("#{models_path}/*").map do |m|
  m.capitalize.camelize.columns.each { |n| puts n.name }
end

我知道这样做有效,所以如果我需要,我可以手动访问模型,但我真的不想这样做......

  Model.columns.each { |c| puts c.name }

3 个答案:

答案 0 :(得分:5)

尝试

Kernel.const_get(m.classify).columns

答案 1 :(得分:3)

classify只是将字符串更改为类似 - 即使用大写字母和camelcase,单数。

使用classify使字符串看起来像类/模型之后,需要使用constantize,它实际上接受字符串并将其转换为类。

请参阅: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize

答案 2 :(得分:1)

您可以使用以下内容:

models = Dir[Rails.root.join("app", "models", "*.rb")].map do |m|
  model = File.basename(m, ".rb").classify.constantize
  model.columns.each { |n| puts n.name }
end