Ruby on rails Rails应用程序中的模块化设计建议

Ruby on rails Rails应用程序中的模块化设计建议,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个应用程序,将有3个模块,每个模块在自己的引擎中创建,即: 管理 通讯录 历法 在管理模块中,管理员用户可以添加、编辑和删除其他用户。这些用户中的每一位都将拥有一些通用功能,比如他们在应用程序上的所有操作日志,以及每个模块的用户权限 在通讯簿模块中,用户将有许多联系人。在日历模块中,用户将有许多事件 我想创建一个单独的用户gem/模块,在所有引擎中共享,但我不确定如何处理特定于每个引擎的关系/模型。我曾想过在每个引擎中扩展用户模块,以包括特定的关系,但随后我需要使用引擎的用户模型而不是主应

我有一个应用程序,将有3个模块,每个模块在自己的引擎中创建,即:

  • 管理
  • 通讯录
  • 历法
  • 在管理模块中,管理员用户可以添加、编辑和删除其他用户。这些用户中的每一位都将拥有一些通用功能,比如他们在应用程序上的所有操作日志,以及每个模块的用户权限

    在通讯簿模块中,用户将有许多联系人。在日历模块中,用户将有许多事件

    我想创建一个单独的用户gem/模块,在所有引擎中共享,但我不确定如何处理特定于每个引擎的关系/模型。我曾想过在每个引擎中扩展用户模块,以包括特定的关系,但随后我需要使用引擎的用户模型而不是主应用程序的用户模型来调用其方法(例如,我必须执行
    地址簿::User.contacts
    而不仅仅是
    User.contacts

    这是我唯一的选择还是我遗漏了一些基本的东西


    如果您对此有任何建议,我们将不胜感激。

    Rails引擎可以选择一个独立的名称空间,正如您在
    AddressBook:User.contacts
    中所描述的那样,但并不总是最好使用它。没有它,您可以在应用程序和每个引擎中定义用户模型,并根据需要扩展该模型。例如,在应用程序中:

    class User < ActiveRecord::Base
      def embiggen
        self.bigness *= 2
      end
    end
    

    然后您总是调用
    User
    ,不必添加
    Engine::User
    前缀

    Rails引擎可以选择一个独立的名称空间,正如您在
    AddressBook:User.contacts中所描述的那样,但并不总是最好使用它。没有它,您可以在应用程序和每个引擎中定义用户模型,并根据需要扩展该模型。例如,在应用程序中:

    class User < ActiveRecord::Base
      def embiggen
        self.bigness *= 2
      end
    end
    

    然后您总是调用
    User
    ,不必添加
    Engine::User
    前缀

    User
    在每个应用程序中是否始终具有完全相同的数据元素,或者
    User
    有时是否需要在主机应用程序中具有其他数据元素?核心
    User
    不会更改(即它始终具有用户权限、用户名等),但关系可能会更改。此外,每个用户将为每个模块提供可定制的字段(例如启用帮助、刷新时间等)
    user
    在每个应用程序中始终具有完全相同的数据元素,或者
    user
    有时需要在主机应用程序中具有其他数据元素?核心
    用户
    不会更改(即,它将始终具有用户权限、用户名等),但关系可能会改变。此外,每个用户将为每个模块提供可自定义的字段(例如,启用帮助、刷新时间等)这是有道理的。我应该使用的名称是
    embiggen
    self.bigness
    ,还是这是一个示例?在您的示例中,用户是在主应用程序中还是在自己的gem中(这是我想要的)?@TheoScholiadis,它们纯粹是示例。你可以在主应用程序或gem中定义用户,由你选择。哦,好吧。我刚刚理解你的意思。我一直在引擎模块中包括我的扩展,比如
    class Engine::User
    Module Engine class User end
    。谢谢。这就澄清了s很重要。比我想象的要简单。这很有意义。
    embiggen
    self.bigness
    是我应该使用的名称,还是这是一个例子?同样,在你的例子中,用户是在主应用程序中还是在它自己的宝石中(这是我想要的)?@TheoScholiadis,它们纯粹是示例。你可以在主应用程序或gem中定义用户,由你选择。哦,好吧。我刚刚理解你的意思。我一直在引擎模块中包括我的扩展,比如
    class Engine::User
    Module Engine class User end
    。谢谢。这就澄清了这很重要,比我想象的要简单。