2

如何在 Rails 中获取模型文件路径?我想要这样的东西:

MyModel.file_path

预期结果:“/app/models/my_model.rb

可以在 Rails 中执行,或者我需要从模型名称创建文件名并在模型目录中找到它?

4

3 回答 3

3

我认为你必须构建它,但相当简单。

它是这样的:

def model_path
  model_file = self.class.name.split("::").map {|c| c.downcase }.join('/') + '.rb'
  path = Rails.root.join('app/models/').join(model_file)
end
于 2013-08-26T14:07:20.233 回答
2

您可以使用__FILE__来引用当前文件路径:

def self.file_path
  File.expand_path(__FILE__)
end

或者

def self.file_path
  __FILE__
end

请注意,Ruby 版本对__FILE__返回的内容很重要。请参阅Ruby 中的 __FILE__ 是什么意思?.

于 2013-08-26T14:47:45.723 回答
0

[改编自这个答案的一部分到一个更一般的问题]

在一个简单的 Rails 应用程序中,应用程序的模型类在其app/models目录中定义,文件路径可以从类名确定派生。可以在特定的模型类中定义检索此路径的方法,MyModel如下所示:

class MyModel
  def self.file_path
    Rails.root.join('app', 'models', "#{klass.name.underscore}.rb").to_s
  end
end

例如,这个特定的模型类MyModel将在 中定义APP_ROOT/app/models/my_model.rb,其中APP_ROOT是应用程序的根目录路径。

为了概括这一点,可以在所有模型类中定义这样一种方法,并考虑对简单的 Rails 路径配置进行扩展。在为模型定义定义自定义路径的 Rails 应用程序中,必须考虑所有这些路径。此外,由于可以在应用程序加载的任何 Rails 引擎中定义任意模型类,因此还必须查看所有加载的引擎,并考虑到它们的自定义路径。以下代码结合了这些注意事项。

module ActiveRecord
  class Base
    def self.file_path
      candidates = Rails.application.config.paths['app/models'].map do |model_root|
        Rails.root.join(model_root, "#{name.underscore}.rb").to_s
      end
      candidates += Rails::Engine::Railties.engines.flat_map do |engine|
        engine.paths['app/models'].map do |model_root|
          engine.root.join(model_root, "#{name.underscore}.rb").to_s
        end
      end
      candidates.find { |path| File.exist?(path) }
    end
  end
end

为了让 Rails 应用这个猴子补丁,require它在config/initializers/active_record.rb.

于 2017-08-11T15:03:42.107 回答