Rails: миграция производственной базы данных, необходимо создавать новые данные для каждого существующего пользователя - PullRequest
2 голосов
/ 27 июня 2011

У меня есть производственная база данных в моем приложении Ruby on Rails, с пользователями и прочим. Теперь при реализации новой функции мне нужно создать новые данные для каждого существующего пользователя. Есть ли какой-нибудь умный способ сделать это? Сценарий граблей может быть?

Подробнее:

У меня есть таблица пользователей. Теперь я добавил таблицу закладок. Идея состоит в том, что у каждого пользователя есть 5 закладок с предварительно заполненными данными по умолчанию. Легко сделать для новых пользователей, но как насчет существующих? Создание данных при входе пользователя в систему - один из вариантов, но он выглядит немного грязным.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Мне нравится использовать rails runner для одного такого сценария, который позволяет вам легко запускать сценарии с загруженным enils rails.,

Я предлагаю использовать activerecord-import , чтобы ускорить его, если у вас много пользователей.

Мы могли бы создать скрипт под названием make_bookmarks.rb в каталоге скриптов, например так:

require 'activerecord-import'

bookmarks = []
User.all.each do |user|
    ["value1","value2","value3","value4","value5"].each do |value|
        bookmarks << user.bookmarks.new(:col => value)
    end
end

# import the bookmarks all with bulk sql = much faster
Bookmark.import bookmarks

затем запустить его rails runner scripts/make_bookmarks.rb

1 голос
/ 27 июня 2011

Один из них заключался в том, чтобы включить переход данных в вашу миграцию, как (в предположении, что ваши отношения has_many используют модель соединения user_bookmark.rb):

class AddBookmarksTable < ActiveRecord::Migration
  def self.up
    create_table :bookmarks, :force => true do |t|
      t.string  :some_col
      t.timestamps
    end
    create_table :user_bookmarks, :force => true do |t|
      t.integer  :bookmark_id, user_id
      t.timestamps
    end
    # create the 5 bookmarks you want to seed as values for existing users
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    # add values to the join table for your model
    User.all.each{|u| Bookmark.all.each{|b| UserBookmark.create(:user_id => u.id, :bookmark_id => b.id)}}
  end

  def self.down
    drop_table :bookmarks
  end
end

В вашем user.rb должно быть

has_many :bookmarks

и bookmark.rb

belongs_to :user

Другой способ (предпочтительный) состоит в том, чтобы просто использовать миграцию для создания таблиц, поскольку начальные данные на самом деле не относятся к миграции, ииметь собственную задачу rake, которая выполняет эту работу внутри lib / tasks.

lib / tasks / add_bookmarks_to_existing_users.rake

namespace :db do
  desc "Add bookmarks to existing users"
  task :add_bookmarks_to_existing_users => :environment do
    # create seed book marks (under impression none exist right now and associations have been set up in user and bookmark models)
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    Bookmark.create(:some_col => 'value')
    User.all.each{|u| u.bookmarks << Bookmark.all}
  end
end

После этого вы можете просто запустить:

rake db:add_bookmarks_to_existing_users
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...