我正在创建一个宝石
我有一个生成器,可以根据您选择的名称创建迁移
rails g my_generator MODEL
我没有使用rails'
rails g migration XYZ
但是相当多地复制模式的样子......例如:如果用户输入以下内容
rails g my_generator Item
你得到:
class CreateItem < ActiveRecord::Migration
def change
create_table "items", force: true do |t|
t.string "title"
t.integer "color_id"
t.integer "size_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "base_product_id"
t.integer "stock_qty"
end
end
end
迁移的名称是(my_generator)create_items.rb我没有在迁移开始时插入时间戳。这实际上是rails g model Item
的迁移与我从生成器获得的迁移之间的唯一区别。
我的迁移没有做任何事情,但我测试了创建新模型,并运行rake db:migrate
,rails g model
迁移,我的不迁移。
这是我的发电机:
class Rails::ShiftedCommerceGenerator < Rails::Generators::NamedBase
def create_main_model
create_file "app/models/shifted_commerce/#{plural_name.singularize}.rb", <<-FILE
class #{class_name} < ActiveRecord::Base
belongs_to :base_#{plural_name.singularize}
has_many :line_items
belongs_to :size
belongs_to :color
validates_uniqueness_of :base_#{plural_name.singularize}_id, :scope => [:size_id]
def is_base_#{plural_name.singularize}?
return true if self.class.name == "Base#{class_name}"
end
def is_#{plural_name.singularize}?
return true if self.class.name == "#{class_name}"
end
def in_stock
self.stock_qty > 0
end
end
FILE
end
def create_main_migration
create_file "db/migrate/shifted_commerce_create_#{plural_name}.rb", <<-FILE
class Create#{class_name} < ActiveRecord::Migration
def change
create_table :#{plural_name}, force: true do |t|
t.string :title
t.integer :color_id
t.integer :size_id
t.datetime :created_at
t.datetime :updated_at
t.integer :base_product_id
t.integer :stock_qty
t.timestamps
end
end
end
FILE
end
end
答案 0 :(得分:1)
确保在生成自己的迁移时包含时间戳
(不使用rails g migration)
您的发电机应该包含以下内容:
create_file "db/migrate/#{Time.now.strftime("%Y%m%d%H%M%S")}_create_#{plural_name}.rb", <<-FILE
.strftime方法是一种将时间戳放入迁移文件的方法,就像rails格式化它一样。