gpt4 book ai didi

ruby-on-rails - Rails 迁移不会创建 NOT NULL 约束

转载 作者:行者123 更新时间:2023-12-05 05:25:25 25 4
gpt4 key购买 nike

我的 Rails 3.2 插件有这个数据库迁移:

class CreateIssueChangeApprovements < ActiveRecord::Migration
def change
create_table :issue_change_approvements do |t|
t.timestamps
t.references :issue, :null => false
t.references :user, :null => false
t.string :field_type, :limit => 30
t.string :old_value
t.string :value
t.integer :approved_by_id
t.boolean :is_closed, :default => 0
t.string :status, :default => '', :limit => 30
end
add_index :issue_change_approvements, :issue_id
add_index :issue_change_approvements, :user_id
end
end

一旦我针对 MySQL 数据库运行它,我发现 issue_iduser_id 字段没有 NOT NULL 约束,也没有外键。

谁能告诉我这样做的正确方法是什么?

更新:

奇怪的是,当我转到 MySQL Workbench 并为我新创建的表生成脚本时,我得到了这个:

CREATE TABLE `issue_change_approvements` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
`issue_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`field_type` varchar(30) DEFAULT NULL,
`old_value` varchar(255) DEFAULT NULL,
`value` varchar(255) DEFAULT NULL,
`approved_by_id` int(11) DEFAULT NULL,
`is_closed` tinyint(1) DEFAULT '0',
`status` varchar(30) DEFAULT '',
PRIMARY KEY (`id`),
KEY `index_issue_change_approvements_on_issue_id` (`issue_id`),
KEY `index_issue_change_approvements_on_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

但是当我运行这样的语句时:

insert into issue_change_approvements(value) values('hello')

它成功执行并添加了包含大量 NULL 值的行。

更新 2:这就是 describe issue_change_approvements 显示的内容:

+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| issue_id | int(11) | NO | MUL | NULL | |
| user_id | int(11) | NO | MUL | NULL | |
| field_type | varchar(30) | YES | | NULL | |
| old_value | varchar(255) | YES | | NULL | |
| value | varchar(255) | YES | | NULL | |
| approved_by_id | int(11) | YES | | NULL | |
| is_closed | tinyint(1) | YES | | 0 | |
| status | varchar(30) | YES | | | |
+----------------+--------------+------+-----+---------+----------------+

最佳答案

默认情况下,Rails 不会创建任何约束。 null: false 选项将不允许此 sql 字段的空值,但不会添加约束。而不是在 Rails 中使用 foreign_key 约束,您通常只需在模型关系上设置所需的选项,例如 has_many :issues, dependent: :destroy我猜选择此策略是为了更快地迁移模式并减少停机时间。

但是,可以选择通过显式指定在数据库级别使用约束。您可以在 rails 4.2 之前使用 foreigner gem,对于 rails 4.2,默认包含它们的 dsl。

Have Some (Referential) Integrity with Foreign Keys

2.5 Foreign Key Support

关于ruby-on-rails - Rails 迁移不会创建 NOT NULL 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31194705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com