2016-09-09 2 views
0

для приложения rails, я использую seeds.rb для заполнения базы данных записями и связанными с ними загрузками изображений. Seeds.rb получает все данные записей из заданного YAML-файла и захватывает файлы изображений из папки для их загрузки. Это хорошо работает в области развития окружающей среды:Rails + Capistrano, база данных по производству семян с загрузкой файлов?

Структура папок:

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 и папку с изображениями для создания записей со связанными с ними файловыми загрузками.

Для развертывания, я использую 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: занести их в базу данных?

(Appearantly это не обычная практика для заполнения базы данных производства, но она работала хорошо, чтобы получить YAML с клиентской стороны со всеми файлами и уже использует эти «правильные» данные для разработки/дизайна)

Спасибо!

ответ

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 
+0

Хорошо, означает ли это, я в основном все загрузки на промежуточную папку, чтобы повторно загрузить его оттуда в мое приложение? Для меня это звучит довольно долго. Существуют ли какие-либо методы для синхронизации разработки с производственной базой данных? Благодарю. – R4ttlesnake

Смежные вопросы