【问题标题】:adding a new column in a rails database migration在 Rails 数据库迁移中添加新列
【发布时间】:2014-12-25 15:55:51
【问题描述】:

所以我已经阅读了很多 Rails 教程,我知道向数据库添加新列的默认设置是,例如,

rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime

上面会添加一个字符串形式的reset_digest和日期形式的reset_sent_at到迁移add_reset_to_users

我的问题是,如果我一晚凌晨 4 点笨手笨脚,只拨打以下电话,该怎么办

rails generate migration add_reset_to_users reset_digest:string

我完全忘记了 reset_sent_at 但想在第二天早上实现它。我犯了将链接直接添加到db文件的错误,这是一个巨大的错误。

在这种情况下我该怎么办?我是否只是简单地调用一个新的迁移,例如

rails generate migration add_reset_sent_to_users reset_sent_at:datetime

或者有更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 database-migration rails-migrations


    【解决方案1】:

    我认为这取决于您的 rails 应用程序处于什么状态。

    如果您正在开发生产应用程序,则不建议编辑迁移,因为会丢失数据,应使用新迁移进行更改。

    如果您在本地进行开发,那么我将直接编辑迁移并添加缺少的列并重新运行您的迁移。

    不要担心编辑迁移,只需记住在进行更改之前rake db:rollback您正在编辑的迁移,否则您会遇到错误。

    这是更改迁移的来源:

    def change
    
        add_column('users', 'reset_digest', :string) 
        add_column('users', 'reset_sent_at', :datetime) # Would have to perform rollback before adding this line
    
    
    end 
    

    到:

    def up
    
        add_column('users', 'reset_digest', :string) 
        add_column('users', 'reset_sent_at', :datetime) # Added after migration
    
        **rake db:migrate
    
    end
    
    def down
    
        remove_column('users', 'reset_digest', :string) 
        remove_column('users', 'reset_sent_at', :datetime) # Add this after rollback
       **rake db:rollback
    
    end
    

    允许您在rake db:rollback 之前对迁移进行更改

    这需要更多的代码,但是当我构建一个新的应用程序并且事情经常发生变化时,我发现它更容易。

    【讨论】:

      【解决方案2】:

      首先,如果你还没有运行你的迁移,你可以直接打开迁移文件,将你的列添加到文件中,如

      def change
       add columns :table_name :column_name :column_type
      end
      

      在您的情况下,您将文件修改为,

      def change
       add columns :users :reset_digest :string
       add columns :users :reset_sent_at :datetime
      end
      

      然后运行

      rake db:migrate
      

      如果您已经运行了迁移,并且之后没有运行任何其他迁移,您可以撤消它,通过

      rake db:rollback STEP=1
      

      然后编辑迁移文件,然后运行迁移

      【讨论】:

      • 对于rake db:rollback,默认STEP为1,你不必显式写在那里。
      • 嗯,是的,默认是1,但是你可以写rake db:rollback STEP=n for n steps
      • 另外,当您与他人共享您的代码时,无论您是否已运行迁移,您都不打算更改迁移文件。这会严重影响其他人的工作和时间。
      • 是的,你是对的,在这种情况下,你需要创建一个新的迁移,你可以在其中修改你之前的迁移
      • 我希望你的意思是你可以“添加以前错过的迁移”而不是“修改你以前的迁移”。
      【解决方案3】:

      Rails 中迁移的经验法则是,您始终创建一个新的迁移文件,除非您尚未与其他人共享您的代码,即推送到远程存储库,否则您可以在运行 $ rake db:rollback 后更改旧迁移文件和一切都会好起来的,没有人会知道,也不会影响其他开发人员的工作(因为它仍在您的本地存储库中)。

      因此,如果您已经提交代码并将其推送到远程存储库,我鼓励您创建一个新的迁移,并且再次更改旧的迁移文件会损害其他开发人员的工作效率。如有任何混淆,请始终创建一个新的迁移:

      rails generate migration add_reset_sent_to_users reset_sent_at:datetime
      

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 2017-08-10
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        相关资源
        最近更新 更多