在迁移期间,根据另一个表中的列设置默认值

时间:2016-02-25 13:57:14

标签: mysql ruby-on-rails activerecord

尝试稍微更改我的数据库。我有两个名为User的表和一个名为Plan的表。我想执行一个迁移,它会在我的User表中添加一列,并根据Plan表中列的值设置该列的默认值。然后将Plan表与User表中与Plan关联的任何其他列一起删除。以下是我到目前为止的代码,但我不确定它是否是最好的方法。

class DropPlansAddPurchasedAuctionsToCompany < ActiveRecord::Migration
  def up
    add_column :users, :purchased_items, :integer, default: 0, after: :legal_name
    User.update_all(:purchased_items => -1).where("plan_id IS NOT NULL")
    remove_column :users, :plan_id
    remove_column :users, :plan_started_at
    remove_column :users, :disable_plan_limits
    drop_table :plans
  end

  def down
    raise ActiveRecord::IrreversibleMigration, "Can't recover plans table"
  end
end

我认为这是正确的方向但是当我运行迁移时,我收到以下错误消息:NoMethodError: undefined method 'where' for 3:Fixnum

有任何见解或建议吗?如果您需要更多信息,我可以提供。

1 个答案:

答案 0 :(得分:1)

update_all返回已更新的记录数,这是一个数字,而不是关系。 您应该在where

之前执行update_all

User.where("plan_id IS NOT NULL").update_all(:purchased_items => -1)