5

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

但是,我们也可以使用:

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

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

4

3 回答 3

6

这实际上取决于 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 模型的关系,这意味着您不仅可以拥有多个数据库,而且它们可以通过活动模型轻松通信。

于 2012-07-03T01:36:46.903 回答
0

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

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

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

于 2014-01-27T22:22:41.723 回答
0

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

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

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

于 2021-05-04T21:12:00.810 回答