Rails + Capistrano,带文件上传的种子生产数据库?

时间:2016-09-09 16:32:01

标签: ruby-on-rails deployment capistrano

对于rails应用程序,我使用seeds.rb使用记录和相关的图像上传来填充数据库。 seeds.rb从给定的YAML文件中获取所有记录数据,并从文件夹中获取图像文件以上载它们。这在开发环境中很有效:

文件夹结构:

rails_app/
  db/seeds.rb
  ...
data/
  images1/
    image1.jpg
    image2.jpg
  images2/
    ...
  data.yml

data.yml:

item1:
  description: Some description
  filepath: images1/image1.jpg

item2:
  description: ...

seeds.rb:

items = YAML.load_file(File.join(Rails.root, '..', 'data', 'data.yml'))
items.each do |item, details|
  # create items with file-uploads, etc.
  ...
end

由于所有数据库内容都已准备就绪,因此我们希望通过rake db:seed为生产数据库播种,并访问我的本地YAML文件和image-folder,以创建包含相关文件上传的记录。 / p>

要部署,我使用Capistrano并已经found a task将数据播种到生产中......

# Add this in config/deploy.rb
# and run 'cap production deploy:seed' to seed your database
desc 'Runs rake db:seed'
task :seed => [:set_rails_env] do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, "db:seed"
      end
    end
  end
end

...不幸的是,此任务仅适用于生产服务器上的seeds.rb,因此无法在本地计算机上找到YAML或图像。

如何为Capistrano编写任务以访问我的本地YAML和文件以及db:将它们播种到数据库?

(显然,这不是种植生产数据库的常见做法,但它很适合从客户端获取所有文件的YAML,并且已经使用了这个"正确的"数据开发/设计)

谢谢!

1 个答案:

答案 0 :(得分:0)

在较高级别,您需要创建deploy:seed先决条件的任务。这将确保您的任务首先在种子脚本执行之前运行。

就您创建的任务而言,您希望它将某些文件上载到同一服务器并相对于运行种子任务的目录。查看您在帖子中粘贴的种子任务,我们可以看到目录为release_path,服务器为primary fetch(:migration_role)

因此,我建议写一个这样的任务:

task :upload_seed_data do
  on primary fetch(:migration_role) do
    execute :mkdir, "-p", release_path.join("../data")
    upload! "../data/data.yml", release_path.join("../data/data.yml")
    # ... and so on for all files you want to upload
  end
end

# Register the prerequisite
before "deploy:seed", :upload_seed_data
相关问题