Один из них заключался в том, чтобы включить переход данных в вашу миграцию, как (в предположении, что ваши отношения 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