2010-11-19 43 views
0

我在找一些提供下列资料:Rails如何在发布后处理模型/默认值问题?

  1. 你有一个应用程序生活与客户和真实数据
  2. 在开发新的功能,你需要添加一列来让说,项目表
  3. 这种新列是某种类型的这是由模型使用before_save

这一切工作正常前进的新项目产生的UID。但是所有现有的项目都没有这个专栏,一切都打破了。

你如何在Rails世界中处理他?

感谢

回答

2

我认为这应该在迁移脚本内处理,而不是Rake任务。

如果我理解正确,那么只需要在列添加到历史记录时执行一次。在我看来,迁移脚本不应该使用破损的数据集来保留应用程序。迁移不仅仅是模式更改。

下面是一个例子:

def self.up 
    change_table :projects do |t| 
    t.integer 'new_column' 
    end 

    Project.reset_column_information 

    Project.all.each do |project| 
    project.new_column = some_value 
    project.save 
    end 
end 

的reset_column_information方法让Rails的知道你刚刚添加的新列的。

+0

我喜欢这个干净。在部署中不太记得,似乎更安全。谢谢史蒂夫。 – AnApprentice 2010-11-19 17:48:28

3

你可以简单地创建一个在所有项目中拉不具有UID和一到每个项目rake任务。

运行迁移后,运行该任务。你所有的项目都应该有一个UID。

+0

同意。如果这是一次性的事情,我通常只是将你在rake任务中的代码直接放入迁移中,因为它与迁移密切相关。或者,如果允许此列的nil值,则更改引用此列的应用程序部分并适当处理它(检查nil)。 – johnmcaliley 2010-11-19 05:25:45

+0

+1表示建议创建一个rake任务。这是我会做的。 :) – Alex 2010-11-19 05:46:44

+0

谢谢大家。我是新的,所以这是有帮助的,虽然似乎没有任何关于这个主题的教程通过谷歌....在轨道上的目录吗?是否存储rake任务,以便我可以在Heroku上运行它们?此外,任何方式你都可以更新你的答案,显示rake任务的基本结构或布局。 – AnApprentice 2010-11-19 06:07:50