Rails:迁移生产数据库,需要为每个现有用户创建新数据

时间:2011-06-27 19:06:28

标签: ruby-on-rails database database-migration

我的Ruby on Rails应用程序中有一个生产数据库,有用户和东西。现在,在实现新功能时,我需要为每个现有用户创建一些新数据。有一些聪明的方法吗?耙脚本可能吗?

更多详情:

我有一张User表。现在我添加了书签表。这个想法是默认情况下每个用户都有5个带有预填充数据的书签。容易为新用户做,但现有的用户怎么样?创建用户登录数据是一种选择,但感觉有点脏。

谢谢!

2 个答案:

答案 0 :(得分:2)

我喜欢使用rails runner这样的一个脚本,这样可以让你轻松运行带有rails env的脚本。 。

如果你有很多用户,我建议使用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 :(得分:1)

其中一个是在迁移过程中包含数据转换(假设你的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 /任务/ 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