如何定义“独特” Ruby on Rails 3 中 MySQL 表列的约束?

发布于 2024-10-07 02:45:23 字数 248 浏览 4 评论 0原文

我有一个简单的 MySQL 表,其中有一列:name

我想在此列上定义一个唯一约束。

我可以这样做:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

但它只能在应用程序级别工作,而不能在数据库级别工作。

你有什么建议?

I have a simple MySQL table with one column: name.

I would like to define a unique constraint on this column.

I can do:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

but it will work only at the application level, not at the database level.

What would you suggest ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

好菇凉咱不稀罕他 2024-10-14 02:45:23

使用以下方法向数据库本身添加唯一约束:

add_index :my_models, :my_column_name, unique: true

...通过迁移(并且您可能希望使 my_column_name 也不接受任何空值:

class CreateMyModels < ActiveRecord::Migration
  def change
    create_table :my_models do |t|
      t.string :my_column_name, null: false

      t.timestamps
    end

    add_index :my_models, :my_column_name, unique: true

  end
end

Add a unique constraint to the database itself using:

add_index :my_models, :my_column_name, unique: true

...through a migration (and you might want to make that my_column_name not accept any null values too:

class CreateMyModels < ActiveRecord::Migration
  def change
    create_table :my_models do |t|
      t.string :my_column_name, null: false

      t.timestamps
    end

    add_index :my_models, :my_column_name, unique: true

  end
end
痞味浪人 2024-10-14 02:45:23

这并不是非常有帮助,但看起来对于在数据库级别强制执行唯一性没有一个很好的答案。来自 Rails 迁移指南

Active Record 方式声称智能属于您的模型,而不是数据库。因此,诸如触发器或外键约束之类的功能(将部分智能推回数据库)并未得到大量使用。

诸如 validates_uniqueness_of 之类的验证是模型强制数据完整性的一种方式。

尽管 Active Record 不提供任何直接使用此类功能的工具,但execute 方法可用于执行任意 SQL。

如果您确实想在数据库中强制执行唯一性,那么使用 ActiveRecord 执行方法自行运行 SQL 命令看起来可能是最好的方法。

This is not super-helpful, but it looks like there is not a great answer for enforcing uniqueness at the database level. From the Rails migration guide:

The Active Record way claims that intelligence belongs in your models, not in the database. As such, features such as triggers or foreign key constraints, which push some of that intelligence back into the database, are not heavily used.

Validations such as validates_uniqueness_of are one way in which models can enforce data integrity.

Although Active Record does not provide any tools for working directly with such features, the execute method can be used to execute arbitrary SQL.

It looks like running the SQL command yourself with the ActiveRecord execute method may be the best way to go if you really want to enforce uniqueness in the database.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文