在生产环境中运行Rails迁移

3

我已经在VPS上使用Passenger和Nginx部署了一个Rails应用程序。现在我添加了以下迁移:

def change
    add_column :order_products, :order_id, :integer
    add_index :order_products, :order_id


    Order.find_each do |order|
      OrderProduct.where(order_number: order.order_number).find_each do |op|
        op.update_attributes!(order_id: order.id)
      end
    end
end

我在VPS上执行了rake db:migrate命令,但这并没有向OrderProduct表中添加任何列。

db/schema.rb包含以下内容:

create_table "order_products", force: :cascade do |t|
    t.string   "order_number"
    t.string   "item_code"
    t.integer  "quantity"
    t.string   "status"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.integer  "order_id"
  end

  add_index "order_products", ["order_id"], name: "index_order_products_on_order_id", using: :btree

当包含 order_id 表示订单编号的一列时,我并没有在 schema_migrations 表中看到最新的迁移版本。

我需要再做些什么来使其在生产环境中运行?

谢谢您的帮助。

2个回答

4

你需要告诉rake你想要在production环境下运行任务,因为默认情况下它会针对development数据库运行迁移:

在旧版本的Ruby on Rails(< 5)中:

$ RAILS_ENV=production rake db:migrate

在新版本的Ruby on Rails中(>= 5),
$ RAILS_ENV=production rails db:migrate

0

正如@spickermann所说,尝试使用rake db:migrate RAILS_ENV=production,如果不起作用,请尝试

rails generate migration AlterOrderProduct 

def up
    add_column(:order_products, :order_id, :integer)
    add_index (:order_products, :order_id)
    Order.find_each do |order|
      OrderProduct.where(order_number: order.order_number).find_each do |op|
        op.update_attributes!(order_id: order.id)
      end
    end
end

def down
    remove_column(:order_products, :order_id, :integer)
    remove_index (:order_products, :order_id)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接