我的Ruby on Rails应用程序中有一个生产数据库,有用户和东西。现在,在实现新功能时,我需要为每个现有用户创建一些新数据。有一些聪明的方法吗?耙脚本可能吗?
更多详情:
我有一张User表。现在我添加了书签表。这个想法是默认情况下每个用户都有5个带有预填充数据的书签。容易为新用户做,但现有的用户怎么样?创建用户登录数据是一种选择,但感觉有点脏。
谢谢!
答案 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