我的Ruby on Rails應用程序中有一個生產數據庫,包含用戶和內容。現在,在實現新功能時,我需要爲每個現有用戶創建一些新數據。有沒有一些聰明的方法來做到這一點?耙腳本可能?Rails:遷移生產數據庫,需要爲每個現有用戶創建新數據
更多詳細信息:
我有一個用戶表。現在我添加了書籤表。這個想法是,每個用戶默認都有5個預填充數據的書籤。容易爲新用戶做,但現有的如何?在用戶登錄時創建數據是一種選擇,但它感覺有點骯髒。
謝謝!
我的Ruby on Rails應用程序中有一個生產數據庫,包含用戶和內容。現在,在實現新功能時,我需要爲每個現有用戶創建一些新數據。有沒有一些聰明的方法來做到這一點?耙腳本可能?Rails:遷移生產數據庫,需要爲每個現有用戶創建新數據
更多詳細信息:
我有一個用戶表。現在我添加了書籤表。這個想法是,每個用戶默認都有5個預填充數據的書籤。容易爲新用戶做,但現有的如何?在用戶登錄時創建數據是一種選擇,但它感覺有點骯髒。
謝謝!
我喜歡用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
一個是包括在您的遷移,如數據轉換(你的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
哇,謝謝,正是我需要的!現在就試試。 –
有趣的事情,試圖耙子的任務。它可以工作,但它只爲最後一個用戶創建數據庫條目。 –
謝謝,那算得很好! –