2

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

我尝试classify了而不是camelize它也没有工作,也尝试在其中插入 a class_eval,但这似乎在这里不起作用/不太了解它。

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 }
4

3 回答 3

5

尝试

Kernel.const_get(m.classify).columns
于 2012-12-27T15:21:30.587 回答
3

classify只需将字符串更改为看起来像一个类——即大写字母和驼峰式单数。

在使用classify使字符串看起来像一个类/模型之后,您需要使用constantize,它实际上获取字符串并将其转换为一个类。

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

于 2012-12-27T15:34:59.333 回答
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
于 2012-12-27T15:26:30.730 回答