专攻难题:Rails、MVC及最常用的Rails命令( 二 )
为了提高效率 , Rails将generate 方法简化为g , 因此上述CLI命令可以简化为:
rails g
文章插图
图源: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)
文章插图
图源:unsplash
- 阿尔法|击败李世石的AI公司,又研发出生物版“阿尔法狗”:破解50年生物学难题
- 效果|术业有专攻!论自拍效果如何,还得看这三款机型
- 破解|“阿尔法狗”亲兄弟AlphaFold破解预测蛋白质结构50年难题
- 难题|西北完测:小技改巧解井口抬升难题
- 人工智能|最新消息,人工智能解决了长达50年的生物学难题,一个巨大的突破
- 核查|进口原料难题解决 生产供货踏实了(图)
- 芯片与光刻机依旧是存在的难题,难道是因为人才都向“钱”看了?
- 这 8 个良心电脑软件,帮你 3 分钟搞定文件管理难题
- 热评丨“携号转网”所有难题的关键点都在于“服务”二字
- 巴基斯坦媒体:中国何时能攻克光刻机难题?发展这项科技迫在眉睫