Rails 4.2 确保数据库中和实例中两列的唯一性

Rails 4.2 Ensuring uniqueness across two columns in DB as well as on instance

我正在学习 Rails,因为我们正在将产品过渡到它。我有一个问题——并且明显缺乏 ruby 的核心技能——我想知道如何解决。我不仅想要一个答案,而且欢迎就是否有更好的方法来实现这一点提出意见。

协会:

我们有一个 Client class 其中 has_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)
)

您可以在迁移中使用数组作为 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