专攻难题:Rails、MVC及最常用的Rails命令( 二 )


为了提高效率 , Rails将generate 方法简化为g , 因此上述CLI命令可以简化为:
rails g --no-test-framework
专攻难题:Rails、MVC及最常用的Rails命令文章插图
图源:unsplash
下列是Rails提供的主要生成器 。 笔者将分别举例说明:
迁移生成器
Rails有一组遵守规范的优质迁移生成器 , 能够有效管理数据库模式 。 绘制域模型后可以进行下一步 。 首先使用案例库应用程序中的数据库迁移并更新 painters 表 。 运用下列命令在表中添加一列 , 将其命名为portrait:
railsg migration add_portrait_to_painters portrait:string --no-test-framework终端显示创建了迁移文件20200928055457_add_portrait_to_painters.rb. 。 由于迁移文件名不得重复 , 生成器会在文件名前加上时间戳 。 神奇的事情发生了——打开db/migrat 目录中创建的文件 , 它现在应该是这样:
class AddPortraitToPainters < ActiveRecord::Migration[6.0]def changeadd_column :painters, :portrait,:stringendend注意到生成器的作用了吗?它自动感知到用户想添加一个新的列 , 构建了add_column 方法调用 。 这是如何做到的?
实践证明 , 命名迁移文件的方法至关重要 。 通过在名称前加上add_文本 , 它向迁移生成器发送了一个信号 , 即这种模式更改的目的是向表中添加一列/多列 。
那么它是如何知道用户想在哪个表上添加的呢?它将_painters 文本附加到迁移名称的末尾 , 以此告诉Rails用户想更改的表格是 painters 表 。 最后 , 通过在命令末尾添加 portrait:string 文本告知生成器新的列的名称为portrait , 数据类型为 string 。
用户可以通过运行rails db:migrate 更新数据库模式 , 该模式也会反映出这次变更 。
删除列则可以运行另外一个迁移:
railsg migration remove_portrait_from_painters portrait:string如果打开此迁移文件则会看到下列代码:
class RemovePortraitToPainters < ActiveRecord::Migration[6.0]def changeremove_column :painters, :portrait,:stringendend运行rails db:migrate 后 , 模式也会得到更新 。 当需要运行任何未决迁移时可以使用这一命令 。
· railsdb:migrate:reset:它会删除数据库信息 , 在新的数据库运行迁移并重新加载种子数据 。
· railsdb:seed:将数据从文件:db/seeds.rb加载到数据库中 。 这种方法对用Rails项目所需的初始数据填充数据库十分有用 。
· railsdb:rollback:回滚上次执行的迁移 。 它会撤销上一次迁移 , 接着用户便可编辑文件并重新运行 rails db:migrate。 注意 , 进行过程中谨慎使用这一命令 , 因为它极具破坏性 , 很有可能造成数据丢失 。 运行时一定确保自己完全清楚运行后的结果 。
模型生成器
这是一种经常使用的生成器类型 。 它适用于编写创建模型和关联数据库表所需的核心代码 , 且不会使应用程序过于复杂 。 一般来说需要模型名称(单数和首字母大写)和模型参数 。
接下来为带有 name、bio和 genre列的Painter 应用程序添加一个新模型 , 可以通过以下CLI命令使用模型生成器:
railsg model Painter name:string genre:string bio:text如果数据类型为字符串 , 则不需要在列名后指定类型 , 因为它是默认数据类型 。 因此如下:
railsg model Painter name genre bio:text因其水平较高 , 这一步已经创建了:
· 添加一个表格和name、genre和 bio列的数据库迁移
· 继承ApplicationRecord (自Rails 5起)的模型文件
我们接下来创建另一个属于Painter的模型Painting:
railsg model Painting name image painter:belongs_to切记首先生成具有has_many宏命令的代码;在运行迁移时只有带有belongs_to 的代码有用 , 否则会得到错误代码:
ActiveRecord::StatementInvalid:PG::UndefinedTable: ERROR: relation "" doesnot exist运行这一生成器会创建出一个迁移文件和 Painter 和Painting模型 。 这一特定的生成器创建了一些具有单命令的不同的功能 , 且仅用最简单的代码就生成出来 。 接着转向自己的模型 , 确保建立适当关系(has_many, belongs_to) 。
下一步是创建一个迁移:rails db:create 和 rails db:migrate来迁移表格 。 用户可以在控制台中测试连接 , 只需要运行rails c并创建一些新的例子 , 不论正确与否都可以测试验证;接下来测试关联度(如Painter.all.first.painting能够检查第一个painter的painting)
专攻难题:Rails、MVC及最常用的Rails命令文章插图
图源:unsplash