Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 数据库间的Rake任务复制_Ruby On Rails_Ruby_Mongodb_Rake_Rake Task - Fatal编程技术网

Ruby on 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任务中,我可以查

我有一个带有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调用,并将数据从生产同步到沙箱

还有一个问题:如果您想确保不更改任何数据,某种只读模式将非常有用(请参见此处)