Ruby on rails 数据库间的Rake任务复制
我有一个带有Mongoid数据库的Rails 4应用程序,希望引入一个沙盒环境进行测试。有一些数据(两个模型),我想从生产数据库复制到沙箱 我会用一个rake任务来完成这个任务,这个任务由cronjob调用。但是,在这个rake任务中,我不确定如何建立到数据库的两个连接,以及如何对不同的数据库使用相同的模型 我也在考虑在mongodb层做这件事(就像他们在这里做的那样),但是有一个模型由数据组成,只应该部分复制到沙盒数据库。因此,我认为我必须在Rails环境中进行 在这个rake任务中,我可以查看所有文章,但我不知道如何将它们“推”到沙盒数据库中:Ruby on rails 数据库间的Rake任务复制,ruby-on-rails,ruby,mongodb,rake,rake-task,Ruby On Rails,Ruby,Mongodb,Rake,Rake Task,我有一个带有Mongoid数据库的Rails 4应用程序,希望引入一个沙盒环境进行测试。有一些数据(两个模型),我想从生产数据库复制到沙箱 我会用一个rake任务来完成这个任务,这个任务由cronjob调用。但是,在这个rake任务中,我不确定如何建立到数据库的两个连接,以及如何对不同的数据库使用相同的模型 我也在考虑在mongodb层做这件事(就像他们在这里做的那样),但是有一个模型由数据组成,只应该部分复制到沙盒数据库。因此,我认为我必须在Rails环境中进行 在这个rake任务中,我可以查
namespace :sandbox do
desc "Syncs production -> sandbox data"
task(:sync => :environment) do |t, args|
Article.all.each do |article|
if my_model1.state == :active
# here it should sync article to the sandbox models
# and then, it should also sync all the comments to the sandbox models
article.comments
end
end
end
end
end
sandbox:
sessions:
default:
database: your_sandbox_db
hosts:
- localhost:27017
production_sync:
database: your_production_db
hosts:
- localhost:27017
我终于自己找到了解决办法。关键是可以在
mongoid.yml
中定义的mongoid会话
如果要将生产数据复制到sandbox,可以在sandbox环境中定义第二个会话(您在sandbox env中启动任务,它允许您访问生产数据库):
您可以通过如下方式为要同步的模型定义单独的类来访问生产\u sync
会话:
class ArticleProduction
include Mongoid::Document
include Mongoid::Attributes::Dynamic
store_in collection: "articles", session: "production_sync"
end
production_articles = ArticleProduction.map(&:attributes)
production_articles.each do |attributes|
Article.create(attributes)
end
现在可以使用此类访问生产数据库。如果要将所有数据从生产复制到沙盒,请执行以下操作:
class ArticleProduction
include Mongoid::Document
include Mongoid::Attributes::Dynamic
store_in collection: "articles", session: "production_sync"
end
production_articles = ArticleProduction.map(&:attributes)
production_articles.each do |attributes|
Article.create(attributes)
end
我给自己定义了一个rake任务,每天由cronjob调用,并将数据从生产同步到沙箱
还有一个问题:如果您想确保不更改任何数据,某种只读模式将非常有用(请参见此处)