【问题标题】:Multiple Rails ORM多个 Rails ORM
【发布时间】:2012-06-27 16:01:17
【问题描述】:

我们有一个 Rails 3 应用程序,其中有一个由 activerecord 映射的 PostgreSQL 数据库(大约 10 个表)。一切正常。

但是,我们也可以使用:

  • 一个 MongoDB 数据库,用于存储图像(可能使用 mongoid gem)。
  • 一个 Neo4j 数据库(可能带有 neo4j-rails gem)而不是某些表的 PostgreSQL。

感谢database.yml,使用带有一个 Rails ORM 的数据库很简单。但是当有多个 ORM 时,我们如何处理呢?有什么好的方法吗?例如,ActiveHash(和 ActiveYaml)可以很好地与 ActiveRecord 配合使用。我认为有可能让不同的 ORM 一起工作。感谢您的任何提示。

【问题讨论】:

    标签: ruby-on-rails-3 mongodb activerecord orm neo4j


    【解决方案1】:

    这实际上取决于 ORM 的类型。一个很好的方法是使用继承。例如,您可以在 database.yml 文件中定义多个数据库和适配器。您可以使用 ActiveRecord 建立连接方法轻松地与这些对话。

    # A typical Active record class
    class Account < ActiveRecord::Base
      ...
    end
    
    # A new database connection
    class NewConnection < ActiveRecord::Base
      self.abstract_class = true
      establish_connection "users_database"
    end
    
    # A new Active record class using the new connection
    class User < NewConnection
      ...
    end
    

    这里唯一的缺点是,当您连接到多个活动记录数据库时,迁移可能会有点冒险。

    混合 ORM 的

    混合 ORMS 很容易。例如 mongodb(使用 mongoid),简单地不要从活动记录继承,并在要使用 mongo 的模型中包含以下内容:

    class Vehicle
      include Mongoid::Document
    
      field :type
      field :name
    
      has_many :drivers
      belongs_to :account
    
    end
    

    建立在活动模型之上的 ORM 可以很好地协同工作。例如,使用 mongoid,您应该能够定义与 ActiveRecord 模型的关系,这意味着您不仅可以拥有多个数据库,而且它们可以通过活动模型轻松通信。

    【讨论】:

      【解决方案2】:

      首先,我强烈建议您不要尝试在同一个应用中拥有多个 ORM。不可避免地,您会希望您的 Mongoid 对象以某种方式与您的 ActiveRecord 对象“关联”。还有一些方法(见下文)......但所有这些最终都会导致痛苦。

      如果您认为您“需要”这样做,那么您可能做错了什么。为什么需要 MongoDB 来存储图像?如果您只是将它用作图像存储,为什么需要 Mongoid 或其他一些 ORM(或更准确地说,ODM)?如果你真的,真的需要添加第二个数据存储和第二个 ORM/ODM,你能把它作为一个单独的应用程序分离出来,并从你的第一个应用程序中调用它作为服务吗?好好想想吧。

      也就是说,如果您真的想使用“多语言持久性”(不是我的术语),那么有一个不错的宝石:https://github.com/jwood/tenacity。它不再积极开发,但维护者确实修复了错误并快速响应查询和拉取请求。

      【讨论】:

      • 您好,我是您的评论。听我说我也想做同样的事情:有一种用于用户注册的 DB 类型和用于业务逻辑的 Neo4J。现在你认为我可以有一个迷你 Ror,它只负责登录过程,然后其他只关注产品的业务逻辑?谢谢!
      【解决方案3】:

      好吧,我今天使用 neo4j gem 时遇到了同样的问题。我在 application.rb 中添加了 require 'active_graph/railtie'。

      所以,当我想使用 ActiveGraph 生成模型时,我使用:rails generate model Mymodel --orm active_graph,使用 --orm 选项可以指定要使用的 orm。

      如果没有 --orm 选项,它将默认使用 AR。

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 2021-06-26
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多