【问题标题】:Migrating data with rake db:migrate does not change it使用 rake db:migrate 迁移数据不会改变它
【发布时间】:2014-06-20 06:40:44
【问题描述】:

我正在为 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) =====================

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

【问题讨论】:

  • 你应该做puts leader.save,才能真正知道保存是否成功。
  • leader.save 返回 true

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


【解决方案1】:

您确定它已被保存。我不是。地点:

puts leader.errors.full_messages.to_sentence

leader.save 字符串之后

【讨论】:

    【解决方案2】:
      leader.save
      puts "After save #{leader.installment_available} #{leader.installment_number}"
      ==> After save true 5  
    

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

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

    但上面是从数据库中获取记录,并清楚地表明更新没有保存在数据库中。

    使用leader.save! 代替leader.save。这样,如果记录没有保存,那么您将确切知道为什么由于引发的异常而没有保存它。

    更新

    根据 OP 对此问题的回答

    我试着放了

    License.reset_column_information

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

    我对@9​​87654329@ 到底做了什么做了一点研究。我发现 Using Models in Your Migrations 说:

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

    希望这有助于您理解为什么需要License.reset_column_information

    【讨论】:

    • 大声笑......他们从文档中删除了这个。难怪我花了很长时间才找到 WTF,Rails。
    • 在我的例子中,save! 没有引发异常,即使该列未能更新。此外,您可以使用leader.reload 而不是leader = License.find(leader.id) 来刷新数据库中的记录。
    【解决方案3】:

    我试着放了

    License.reset_column_information
    

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

    【讨论】:

    • 有关详细信息,请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2017-02-05
    • 2017-01-07
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多