【问题标题】:creating tables in ruby-on-rails 3 through migrations?通过迁移在 ruby​​-on-rails 3 中创建表?
【发布时间】:2011-12-15 17:45:51
【问题描述】:

我试图了解在 ruby​​-on-rails 3 中创建表的过程。

我已阅读有关迁移的信息。所以我应该通过编辑以下文件来创建表格:

Database Migrations/migrate/20100611214419_create_posts
Database Migrations/migrate/20100611214419_create_categories

但它们是由以下人员生成的:

rails generate model Post name:string description:text
rails generate model Category name:string description:text

这是否意味着我每次要创建表时都必须使用“rails generate model”命令?

如果我创建一个迁移文件但想添加列怎么办。我是创建另一个迁移文件来添加这些文件还是直接编辑现有的迁移文件?指南告诉我添加一个新的,但这是我不明白的部分。为什么我要添加一个新的?因为那么新状态将依赖于 2 个迁移文件。

然后如何添加新的迁移文件进行更新?命令是什么?如果我必须删除列或编辑它们。它是怎么做到的?

rails generate model Post name:string description:text

因为上面的命令只是添加列。

如果我不使用命令,我如何创建迁移文件?

在 symfony 中我只是直接编辑 schema.yml 文件,没有带有版本控制等的迁移文件。

我认为在 django 中你只需创建模型,它就会创建数据库表。

我是 RoR 的新手,想了解如何创建表格。

谢谢

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果你想更新一个表,你必须创建一个新的迁移文件,因为每个迁移只在数据库上执行一次。因此,如果您已经有一个 posts 表,那么在修改 create_posts 迁移后,您将无法再次运行它。

    您可以回滚迁移,然后再次运行它们。这会解决问题,但也会破坏表和它可能保存的数据。如果您刚刚创建迁移然后注意到您错过了一列,这不是问题。然后你可以只添加列到迁移,回滚和迁移。但是你不想在生产数据库上这样做!

    要创建一个新的迁移,您只需运行:

    rails generate migration migration_name
    

    如果您将迁移称为add_*_to_table,那么您也可以传递与generate model 中相同的参数:

    rails generate migration add_something_to_posts something:boolean
    

    这将自动生成此迁移:

    class AddSomethingToPosts < ActiveRecord::Migration
      def self.up
        add_column :posts, :something, :boolean
      end
    
      def self.down
        remove_column :posts, :something
      end
    end
    

    这也适用于remove_*_from_table

    rails generate migration remove_something_from_posts something:boolean
    

    迁移将是:

    class RemoveSomethingFromPosts < ActiveRecord::Migration
      def self.up
        remove_column :posts, :something
      end
    
      def self.down
        add_column :posts, :something, :boolean
      end
    end
    

    这里是您可以在迁移中使用的some more methods

    【讨论】:

    • 您不应该在回滚之前修改迁移,除非回滚被破坏。因为当您添加新列时,您还必须删除回滚列。但是,数据库模式当前不包含新列,因此回滚不正确。我不确定它是否会出错,但这是要避免的。
    【解决方案2】:

    要生成独立的迁移文件,您将使用:

    rails generate migration your_migration_name_here
    

    转到生成的文件后,您可以执行任何您喜欢的 SQL,查看其他生成的迁移也将为您提供一个很好的起点。

    通常在 Rails 中,数据库中的每个表都有一个模型。我想不出任何特定的用例,其中您将拥有一个没有某种模型来访问该数据的表。如果您想深入了解迁移,请转至here

    【讨论】:

    • 有一种情况。 has_and_belongs_to_many 关系的连接表。
    【解决方案3】:

    关于这个问题这是否意味着我每次要创建表时都必须使用rails generate model 命令?

    试试migration_for
    我觉得这对我很有帮助。在author's blog上找到指令

    rails g migration_for create_table:posts add_column:posts:title:string add_column:posts:user_id:integer add_index:posts:user_id  
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多