使用rake db:migrate迁移数据不会更改它

时间:2014-05-03 17:10:43

标签: ruby-on-rails ruby database-migration dbmigrate

我正在努力使用rails和db:migrate。我使用此代码进行迁移

class SetDefaultInstallmentsForLicenses < ActiveRecord::Migration
  def up
    License.where(code: 'LEADER').each do |leader|
      puts "Modifying license #{leader.id} with code #{leader.code}"
      leader.installment_available = true
      leader.installment_number = 5
      leader.save
      puts "After save #{leader.installment_available} #{leader.installment_number}"
      leader = License.find(leader.id)
      puts "After save #{leader.installment_available} #{leader.installment_number}"
    end
  end

  def down
  end
end

运行迁移后有输出

==  SetDefaultInstallmentsForLicenses: migrating ==============================
Modifying license 3 with code LEADER
After save true 5
After save f
==  SetDefaultInstallmentsForLicenses: migrated (0.0037s) =====================

清楚地看到迁移已执行,记录已找到,已更改并已保存,但在重新加载记录后,更改不存在。 怎么了?

3 个答案:

答案 0 :(得分:2)

  leader.save
  puts "After save #{leader.installment_available} #{leader.installment_number}"
  ==> After save true 5  

以上仅显示installment_availableinstallment_numberlocal variable leader字段的值,而不是从数据库中提取值。 这并不意味着这些字段已成功保存在数据库中。

  leader = License.find(leader.id)
  puts "After save #{leader.installment_available} #{leader.installment_number}"

但以上是从数据库中获取记录,并清楚地显示更新未保存在数据库中。

而不是leader.save,请使用leader.save!。这样一来,如果没有保存记录,那么你就会知道为什么因为引发的异常而没有保存它。

<强>更新

根据OP在这个问题上给出的答案

  

我试图把

     

License.reset_column_information

     

在代码之前它似乎是   现在工作。我不知道为什么这里需要这个。我所有的   迁移似乎正常运作。

我做了一些研究License.reset_column_information到底做了什么。我找到了 Using Models in Your Migrations ,其中说:

  

使用本地模型时,最好调用Product.reset_column_information刷新Active Record缓存   在更新数据库中的数据之前的产品型号。

希望这可以帮助您理解为什么需要License.reset_column_information

答案 1 :(得分:1)

我试图把

License.reset_column_information
在代码之前

它似乎现在正在工作。 我不知道为什么这里需要这个。我的所有其他迁移似乎都正常工作。

答案 2 :(得分:0)

你确定它已被保存。我不是。位:

puts leader.errors.full_messages.to_sentence

leader.save字符串

之后