【问题标题】:Rails project organization with many models具有多种模型的 Rails 项目组织
【发布时间】:2011-02-11 21:04:51
【问题描述】:

我正在开发一个 Rails 应用程序,该应用程序开始拥有(在我看来)很多模型。目前有 15 个,但我正在考虑再添加 3-4 个作为“标签”之类的模型(我需要比 Acts As Taggable 提供的更多功能)。

所以,这让我有点恼火的原因是 15 个模型中有 7 个属于一个共同的父代。有几个是belong_to,有几个是has_and_belongs_to_many。我正在考虑的所有新模型也将属于同一个父模型。

那么,我想知道的是,组织这种情况的最佳“Railsy”方式是什么?

比起app/models 挤满了 6 个“一流”模型和其中一个模型的 10 多个孩子,我应该/可以开始在我的应用程序文件夹中使用子文件夹吗?即:app/models/parent/child.rb?

我知道这是一个开放式问题,但我非常感谢有关处理具有大量模型的 Rails 项目的最佳方法的建议。

谢谢!

【问题讨论】:

  • 让我强调一下:如果有人对如何处理具有许多依赖关联模型的模型有一般性的指导,我只会对一般的最佳实践技巧感兴趣。

标签: ruby-on-rails ruby-on-rails-3 models organization


【解决方案1】:

你可以这样做,我总是这样做:)

请注意一些事情:如果您创建一个名称为您的模型名称的文件夹,它将失败。实际上,Rails 会认为你想扩展它。

所以在你的模型文件夹中,在你的类名前面加上你想要的任何花哨的东西。

例子:如果要放用户相关的模型,放models/user_related/

您必须将其添加到您的 application.rb 文件中:

config.autoload_paths += Dir["#{Rails.root.to_s}/app/models/*"].find_all { |f| File.stat(f).directory? }  

这将自动加载包含在modelsdirectory 中的所有文件夹。

【讨论】:

  • 我是否需要做其他特别的事情才能使用保存在子文件夹中的模型?顺便说一句:foo_related 是一个很棒的文件夹名称,感谢您的命名提示。
  • 太好了,谢谢。这是一个很大的帮助!不过,我将把这个问题留得更久一点,以防其他人有任何指示。谢谢!
  • "如果您创建一个文件夹,其名称为您的模型之一,它将失败。" - 节省了我的时间。谢谢
【解决方案2】:

我认为 apneadiving 的答案是个好方法

根据对 activesupport 3.0.11 的研究,在选择目录名称时需要遵循一些规则:

  1. 名称不能与系统中的常量匹配,否则可能会发生 LoadError
  2. 名称必须能够转换为有效的常量名称,否则会发生 NameError。

问题#1的解释

Apneadiving 的目录名称 app/models/user_related 示例只要 永远不会在您的代码中使用常量 UserRelated。否则 LoadError 可能 可能发生。

例如,假设有一个名为 UserProfile 的模型,并且第一次 rails 看到常量在 UserRelated 模块中。 Rails 将首先尝试 加载 UserRelated\:\:UserProfile 常量并失败 UserProfile 常数。

如果 user_profile 文件位于 app/models/user_related/user_profile.rb,则此 匹配 UserRelated\:\:UserProfile 的下划线路径,文件将 加载期望定义 UserRelated::UserProfile 常量。这 会引发以下错误,因为它确实定义了 UserProfile 常数。

Expected app/models/user_related/user_profile.rb to define UserRelated::UserProfile (LoadError)

这发生在活动支持依赖代码中。

问题#2的解释

另一个警告是目录名称必须能够变成有效的 ruby 常量名(尽管遵循#1 常量应该是未定义的)。为了 例如,如果目录名称是 app/models/user.related 这将导致 在active_support依赖代码中出现以下错误:

wrong constant name User.related (NameError)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2011-01-12
    • 2017-05-05
    • 2021-10-10
    相关资源
    最近更新 更多