mysql - 混合了 mongodb 和 mysql 的 rails 模型

标签 mysql ruby-on-rails mongodb activerecord mongoid

我有一个名为“info_item”的 mysql 表,可以使用 mongodb 文档对其进行扩展:

class CreateInfoItems < ActiveRecord::Migration
  def change
    create_table :info_items do |t|
      t.integer     :machine_id
      t.binary      :external_id
      t.integer     :info_type_id
      t.timestamps null: false
    end
  end
end

“external_id”字段将成为 mongodb 文档的 ID。

如何在我的模型中表示它? 我想到了一个继承自 ActiveRecord::Base 并包含 Mongoid::Document 的对象:

class InfoItem < ActiveRecord::Base
end

class PhoneNumber < InfoItem
  include Mongoid::Document
end

它会运行吗?你有其他想法吗?

最佳答案

我认为您最好用手将它们连接在一起。 ActiveRecord::BaseMongoid::Document 都将尝试定义所有常见的 ORM-ish 方法,因此它们将相互争斗; ActiveRecord::Base 也将尝试使用该设置执行 STI,而您在这里对 STI 没有任何用处。

不要为 external_id 使用 binary,AR 可能最终会尝试将 BSON::ObjectId 序列化为 YAML 而你最终会得到一堆令人困惑的垃圾。相反,将 BSON::ObjectId 存储为 24 个字符的字符串:

t.string :external_id, :limit => 24

然后这样说:

info_item.external_id = some_mongoid_document.id.to_s

并手动实现常用的关系方法:

def external
  external_id ? WhateverTheMongoidClassIs.find(external_id) : nil
end

def external=(e)
  self.external_id = e ? e.id.to_s : nil
end

您可能希望覆盖 external_id= 以根据需要对输入进行字符串化,并将 external_id 覆盖为 BSON::Object_id.from_string 输出。

我混合使用 PostgreSQL 和 MongoDB 应用程序,这就是我使用的方法,它运行良好并使两个数据库中的所有内容都保持合理。

关于mysql - 混合了 mongodb 和 mysql 的 rails 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672169/

相关文章:

mysql - 查找与同一列中的多个值匹配的不同元素

php - Innodb 全文搜索中的转义 @ 符号

mysql - mysql 中的日期格式%d/%m%y

MySQL 分区错误

java - 使用antlr parsetree将sql查询解析为Java中的mongo bson文档

ruby-on-rails - PG::UndefinedTable: 错误: 缺少 FROM 子句 -- 使用 "includes"Rails 订购关联记录

ruby-on-rails - Rails 未定义方法 `name' for nil :NilClass on FileUpload Too much unknown

ruby-on-rails - rails : complex html <a> into link_to helper

mongodb - 如何告诉 MongoDB C# 驱动程序以字符串格式存储所有 Guid?

php - Symfony2 mongodb 安装