轨道 - 使用"轨道生成模型"指定不可为空的字段类型



根据rails文档

http://guides.rubyonrails.org/migrations.html

2.3 支持的类型修饰符表示应该可以修改字段以允许或禁止列中的 NULL,并且可以在终端上执行此操作

这就是我想在迁移文件中显示的内容

class CreateTestModels < ActiveRecord::Migration
def change
create_table :test_models do |t|
t.string:non_nullable, :null => false
t.timestamps
end
end
end

在终端上,我试过

rails generate model TestModel non_nullable:string{null}
rails generate model TestModel 'non_nullable:string{null: false}'

我想不出任何其他表达方式

注意:我已经知道您可以进入迁移文件并手动添加它。这不是我要找的。

文档提到

一些常用的类型修饰符可以直接在命令行上传递。它们用大括号括起来,并遵循字段类型

但他们没有详细说明哪些"常用"修饰符会起作用。

正如罗杰斯先生所指出的 只有三个受支持的选项:

  • 字符串/文本/二进制/整数的长度 (name:string{255})
  • 精度,小数位数 (dollar_fragment:decimal{3,2})
  • 多态性参考/belongs_to (agent:references{polymorphic})

正如用户2903934所提到的 有可能从命令行作为黑客进行这项工作。

注意:这是一个黑客。 我不建议这样做,但它确实回答了你的问题。

rails generate model TestModel 'non_nullable, null => false:string'

它看起来像是在第一个冒号上分裂的,所以我们可以使用哈希火箭语法在那里潜入选项。这会产生:

class CreateTestModels < ActiveRecord::Migration
def change
create_table :test_models do |t|
t.string :non_nullable, null => false
t.timestamps
end
end
end

这显然不是官方支持的,它只是碰巧有效。

我能得到的最接近你的解决方案是这样的:

rails generate model TestModel non_nullable,null:string

我无法弄清楚,之后会发生什么,但这应该给你一个开始

您可以使用https://github.com/rails/rails/pull/38870 打开编辑器(适用于 Rails 版本> 6.1.0)

要使用null: false从命令行创建迁移,首先需要启用EDITOR_FOR_GENERATOR

# config/application.rb
# https://github.com/rails/rails/pull/38870#issuecomment-609018444
config.generators.after_generate do |files|
if ENV["EDITOR_FOR_GENERATOR"]
files.each do |file|
system("#{ENV["EDITOR_FOR_GENERATOR"]} #{file}")
end
end
end

然后使用sed追加到特定列。

例如,您要创建一个具有jtiexp列的模型,并向其添加索引(使用:index在命令行上支持索引)。 我们需要匹配行t.string :jti并附加到它,以便最终结果t.string :jti, null: false

这是我使用的命令:

# rails g model CreateJwtDenylist jti:index exp:datetime:index
# replace jti and exp with your column names
EDITOR_FOR_GENERATOR='sed -i "" -r -e "/^[[:space:]]*t.*(jti|exp)$/ s/$/, null: false/"' rails g model CreateJwtDenylist jti:index exp:datetime:index

这适用于rails g migrationrails g model

生成的迁移是

# db/migrate/20230121091319_create_jwt_denylist.rb
class CreateJwtDenylist < ActiveRecord::Migration[7.0]
def change
create_table :jwt_denylists do |t|
t.string :jti, null: false
t.datetime :exp, null: false
t.timestamps
end
add_index :jwt_denylists, :jti
add_index :jwt_denylists, :exp
end
end

你可以在你的模型类中这样做,就像这样——

class TestModel < ActiveRecord::Base
validates_presence_of :non_nullable
end

相关内容

  • 没有找到相关文章

最新更新