2011-06-27 46 views
2

我的Ruby on Rails應用程序中有一個生產數據庫,包含用戶和內容。現在,在實現新功能時,我需要爲每個現有用戶創建一些新數據。有沒有一些聰明的方法來做到這一點?耙腳本可能?Rails:遷移生產數據庫,需要爲每個現有用戶創建新數據

更多詳細信息:

我有一個用戶表。現在我添加了書籤表。這個想法是,每個用戶默認都有5個預填充數據的書籤。容易爲新用戶做,但現有的如何?在用戶登錄時創建數據是一種選擇,但它感覺有點骯髒。

謝謝!

回答

2

我喜歡用rails runner爲一次性腳本,這樣它可以讓你輕鬆運行腳本與加載軌道env。 。

我建議使用activerecord-import加速它,如果你有很多的用戶。

我們可以做一個腳本調用make_bookmarks.rb在這樣的scripts目錄:

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

+0

謝謝,那算得很好! –

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 

另一種方法(首選)是隻我們e遷移到創建表,因爲種子數據並不真正屬於遷移,並且擁有一個自定義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 
+0

哇,謝謝,正是我需要的!現在就試試。 –

+0

有趣的事情,試圖耙子的任務。它可以工作,但它只爲最後一個用戶創建數據庫條目。 –

相關問題