2011-06-27 10 views
2

私はRuby on RailsアプリケーションにプロダクションDBを用意しています。新しい機能を実装するときは、既存のすべてのユーザーに新しいデータを作成する必要があります。それを行うにはいくつかの巧妙な方法がありますか?レイクのスクリプトかもしれない?Rails:本番データベースを移行し、既存のすべてのユーザのために新しいデータを作成する必要があります

詳細:

私はUserテーブルを持っています。今すぐブックマークテーブルを追加しました。アイデアは、すべてのユーザーがデフォルトでプレフィルドされたデータを持つ5つのブックマークを持っているということです。新しいユーザーにとっては簡単ですが、既存のユーザーはどうですか?ユーザーのログイン時にデータを作成することも可能ですが、それはちょっと汚いと感じます。

ありがとうございます!

答えて

2

を私はあなたが簡単にスクリプトを実行することができます。このようなスクリプトをオフ1用のrails runnerを使用したいですレールが装備されています。 。

多くのユーザーがいる場合は、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

+0

ありがとう、それはかなりうまくいった! –

1

一つは、(仮定の下であなたにhas_many関係が参加モデルuser_bookmark.rbを使用しています)のようなあなたの移行におけるデータ移行を含めることでした。あなたのuser.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 

あなたは

has_many :bookmarks 
を持つべきです

および他の方法(優先)はちょうど私達になり

belongs_to :user 

をbookmark.rbシードデータは実際に移行に属していないので、テーブルを作成するためのマイグレーションや、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

面白いことに、そのレーキタスクを試みました。それは動作しますが、最後のユーザのdbエントリだけを作成します。 –

関連する問題