根据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
追加到特定列。
例如,您要创建一个具有jti
和exp
列的模型,并向其添加索引(使用: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 migration
和rails 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