Rails has_one 关系
Rails has_one relationship
我想知道为什么当我有 1:1 关系(has_one
、belongs_to
)时,我可以通过控制台插入重复的 ID。
例如,有两个子对象在外键中具有相同的父对象。
默认情况下外键不是必须是唯一的,还是我应该包含 unique: true
之类的内容?
默认情况下,外键不是唯一的。让我们看一个实际的例子,你有一个用户的实体类型,一个用户可能通过外键有一个老板。默认情况下,可能有多个用户拥有相同的老板。如果需要使其唯一,则需要指定该约束。如果你需要确保每个人都有老板,你也需要指定。
这不是默认设置,但实现起来并不困难。首先,创建迁移以在数据库中添加唯一性约束:
来自终端:
rails g migration add_uniqueness_to_your_table_column
在生成的文件中:
add_index :table_name, :column, unique: true
如果您有兴趣,尽管关键是索引用于检查唯一性。
然后,在 运行:
之前确保数据库中没有当前重复项(否则会失败)
rails db:migrate
最后,您还可以在模型级别执行此操作,使用:
# your_model.rb
validates :column, uniqueness: true
希望对您有所帮助 - 如果您对此有任何问题或意见,请告诉我。
我想知道为什么当我有 1:1 关系(has_one
、belongs_to
)时,我可以通过控制台插入重复的 ID。
例如,有两个子对象在外键中具有相同的父对象。
默认情况下外键不是必须是唯一的,还是我应该包含 unique: true
之类的内容?
默认情况下,外键不是唯一的。让我们看一个实际的例子,你有一个用户的实体类型,一个用户可能通过外键有一个老板。默认情况下,可能有多个用户拥有相同的老板。如果需要使其唯一,则需要指定该约束。如果你需要确保每个人都有老板,你也需要指定。
这不是默认设置,但实现起来并不困难。首先,创建迁移以在数据库中添加唯一性约束:
来自终端:
rails g migration add_uniqueness_to_your_table_column
在生成的文件中:
add_index :table_name, :column, unique: true
然后,在 运行:
之前确保数据库中没有当前重复项(否则会失败)rails db:migrate
最后,您还可以在模型级别执行此操作,使用:
# your_model.rb
validates :column, uniqueness: true
希望对您有所帮助 - 如果您对此有任何问题或意见,请告诉我。