在生产上运行rails迁移

时间:2016-02-06 14:59:47

标签: ruby-on-rails ruby passenger postgresql-9.3

我已经在VPS上使用乘客和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 个答案:

答案 0 :(得分:1)

你需要告诉rake你想在production环境中运行任务:

$ RAILS_ENV=production rake db:migrate

答案 1 :(得分: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