【问题标题】:Rails console display all modelsRails 控制台显示所有模型
【发布时间】:2015-11-07 22:39:16
【问题描述】:

rails console 中是否有显示所有导轨模型的方法?

类似这样的:

Models.all

结果如下:

[Customer, Site, Page, Download]

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

试试这个:

ActiveRecord::Base.subclasses

这将返回一个数组,因此要仅获取模型的名称,您需要运行:

ActiveRecord::Base.subclasses.map(&:name)

【讨论】:

  • 不需要send#subclasses 是公开的。
  • 你不需要send ..这是一个公共方法
  • ActiveRecord::Basesn-p 有什么缩写吗?每次我需要来自基础层的东西时,我需要使用它吗?
  • 这真的一直有效吗?当我尝试这个时,一些模型直到我在代码中使用它们才被包括在内,它包括一些显然与has_and_belongs_to_many 做某事的非模型类。例如,我得到 [UserUser::HABTM_Agencies],然后我调用 Agency,然后我得到 [UserUser::HABTM_AgenciesAgencyAgency::HABTM_Users]
  • 这仅适用于加载的文件。因此,在开发环境中,您只会获得模型的一个子集。这在生产中不是问题,因为模型是预先加载的。一个可能的解决方案是在运行子类之前运行Dir["#{Rails.root}/app/models/**/*.rb"].each {|f| puts f; require File.basename f}
【解决方案2】:

只要运行:

Rails.application.eager_load!
ActiveRecord::Base.subclasses

【讨论】:

    【解决方案3】:

    我尝试了上面的两个答案,它没有按预期工作。我得到了这个结果,

    ["User", "HABTM_Roles", "ApplicationRecord", "PublicActivity::ORM::ActiveRecord::Activity", "ApplicationRecordGlobal", "HABTM_Users", "UserSync"] 
    

    对我有用的是,

    Rails.application.eager_load!
    ApplicationRecord.subclasses.map(&:name)
    

    【讨论】:

    • 我认为原始答案是针对旧版本的导轨。我正在使用 rails gem 'rails', '~> 5.0.5' 这对我有用。很好的发现!
    【解决方案4】:

    如果你运行rails c-e production,那么

    ApplicationRecord.subclasses
    ApplicationRecord.subclasses.map(&:name)
    

    如果你在开发中运行rails c,你需要在上面的命令之前运行eager_load

    Rails.application.eager_load!
    

    所有模型都继承自 ApplicationRecordApplicationRecord 继承自 ActiveRecord::Base。 和eager_load! 将加载所有模型,但在开发环境中eager_load 是错误的。你可以在config/environments/development.rb找到这个配置

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2016-08-21
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多