【发布时间】:2016-09-01 18:45:37
【问题描述】:
我有一个场景,我需要将一个用户的数据从我的 Rails 应用程序转储/传输到另一个具有相同配置和表的数据库。例如,应用程序构建为
class Company < ActiveRecord::Base
has_many :depots
has_many :users
end
class Depot < ActiveRecord::Base
belongs_to :company
has_many :products
end
class User < ActiveRecord::Base
belongs_to :company
end
class Product < ActiveRecord::Base
belongs_to :depot
end
我的要求是,如果 companyA 停止付款,我想将他们的数据转储到另一个数据库(例如 databse2)以保持我的实际数据库清洁,一旦他们回来并开始付款,我希望这些数据回来。
第二个要求是,database2 中已经可以有一些数据。所以我需要保留所有记录,并且我想更改 companyA 的 ID(因为可能已经有一家公司具有相同的 ID),同时保存到 database2 中保持关联不变。这样做似乎很愚蠢,但这是我的要求。 我使用 Postgres 作为我的应用程序数据库。 有什么帮助???
【问题讨论】:
-
这听起来很乱,但只要您不更改任何 ID 并且不更改您的序列生成器,您就会没事的。切勿重新签发 ID。这简直是鲁莽。由于一个简单的错误,您冒着一家公司“继承”另一家公司数据的风险。
-
我试图克隆记录,然后使用 ActiveRecord 和 Amoeba 之类的 gem 将其保存到新数据库,但这会弄乱所有应用程序,因为我在 nil 父级的模型中有很多验证- id 约束。
-
您需要问自己的第一个问题是存储开销是否足够严重,您首先真的需要这样做。要调查的第二件事是您是否可以简单地序列化所有内容并将其作为文件转储,然后稍后将其反序列化回您的数据库。您可以以 gzip 为例在 JSON 中执行此操作。除非您需要在线数据,否则没有明确需要第二个数据库,如果需要,请将其保存在主数据库中。
-
无论你在这里做什么,操作越低级越好。不惜一切代价保留 ID。不要填坑。避免使用模型,因为它们会改变创建/更新的时间戳字段。
-
未来我将拥有几家拥有大量数据的公司。在数据库中保留不必要的数据是一种开销。其次,我的客户的要求不太可能引起争议:-(。我也尝试将其另存为 JSON,但我的问题是 ID。如果我将 JSON 数据恢复到原始数据库中,则解析时可能会损坏它。第二个数据库的好处是,我可以随时将它连接到 ActiveRecord 以向公司展示。
标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord associations