【问题标题】:Populating a newly added column in Rails在 Rails 中填充新添加的列
【发布时间】:2011-01-04 03:10:35
【问题描述】:

我通过迁移向我的数据库中名为 property 的表添加了一个新列 default

class AddDefaultToProperty < ActiveRecord::Migration
  def self.up
    add_column :property, :is_default, :boolean
  end

  def self.down
    remove_column :property, :is_default
  end
end

default 列包含一个 boolean 值,该值表示 property 是否为默认值。现在我需要一种方法来为某些特定行填充该列。完成这项任务的最佳方法是什么?默认属性可能会在不久的将来发生变化,所以我需要一些灵活的方法来考虑这种情况。

使用轨道 2.3.10

谢谢!

【问题讨论】:

    标签: ruby-on-rails database populate fill


    【解决方案1】:

    这取决于。如果它是迁移的一个组成部分,并且您希望在迁移完成后立即可以使用该数据,那么您应该将该脚本直接放入迁移中。如果数据可用性可以等待,您还可以选择创建 rake 任务来填充数据 - 好处是您的迁移会更快,并且 rake 任务是可选的 - 缺点是您必须手动运行它。

    【讨论】:

    • 是的,数据可用性可以等待。我认为第二种选择会更合适。但我该怎么做呢?我认为的简单解决方案是找到我需要设置为默认值的每一行并将列更新为 1。还有其他更好的方法吗?
    • 最快的方法是使用 MySQL 命令——因为更新将在服务器上进行,而不是将该信息传递回 Rails。例如,您可以创建一个 Rake 任务来执行以下 SQL:“UPDATE property SET is_default = 1 WHERE some_attribute = true AND some_other_attribute = false”。如果这不是一个选项,您可以创建一个 Ruby 循环来更新每条记录。
    【解决方案2】:

    我会建议更改迁移中的数据。这可确保进一步的迁移始终按预期进行。

    但是,始终确保您创建自己的模型以在迁移中使用,否则新模型和旧架构之间的冲突会影响您。

    只需将此行添加到迁移的顶部即可:

    class Property < ActiveRecord::Base; end
    

    【讨论】:

    • 您可以通过在迁移中使用“reset_column_information”命令来避免新模型和旧模式的问题:Property.reset_column_information。这会将架构信息重置为最新的可用架构,并避免必须对每个模型进行猴子补丁。
    • @pan 我更多地谈论诸如验证不存在的列之类的事情。虽然这也是一个有效的观点。
    猜你喜欢
    • 2023-03-14
    • 2019-12-19
    • 2022-11-23
    • 2018-12-16
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多