自定义生成器的迁移不要迁移

时间:2014-11-14 05:31:52

标签: ruby-on-rails ruby ruby-on-rails-4 migration

我正在创建一个宝石

我有一个生成器,可以根据您选择的名称创建迁移

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:migraterails 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

1 个答案:

答案 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格式化它一样。