我有一个名为“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::Base
和 Mongoid::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/