Rails 4.2确保DB和实例中两列的唯一性

时间:2015-04-10 17:25:04

标签: mysql ruby-on-rails ruby-on-rails-4 activerecord rails-migrations

我正在学习Rails,因为我们正在将产品过渡到它。我有一个问题 - 并且明确缺乏红宝石的核心技能 - 我想知道如何解决。我不仅希望得到答案,还欢迎就是否有更好的方法来达成这一目标。

协会

我们有一个Clienthas_many :usersUser belongs_to Client

除了:client_id列之外,我们还有一个:email列,在:client_id

范围内应该是唯一的

验证

我已经看到我可以做这样的事情,通过将此检查添加到User模型来确保在实例级别上。

validates :email, uniqueness: {scope: :client_id}

但就我的理解而言,这并不能确保架构中的唯一性。请记住,我试图避免使用SQL手动更改架构,如果可能,我希望通过迁移执行此操作。在其他唯一性检查中(对于非范围的唯一性),为了确保在迁移中我会做这样的事情的独特性:

add_index :users, :email, unique: true

但这并不是我想要的,我不这么认为。

欢迎提示,技巧,评论,建议和答案!

修改 MySQL示例:

CREATE TABLE IF NOT EXISTS users (
email VARCHAR(200),
client_id INTEGER,
UNIQUE INDEX (email, client_id)
)

1 个答案:

答案 0 :(得分:2)

您可以在迁移中使用数组作为add_index的第二个参数:

add_index "users", ["client_id", "email"], :unique => true

这应该产生:

CREATE UNIQUE INDEX users_client_id_email ON users(client_id, email)

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index