1

I am learning Rails right now as we transition a product to it. I have a problem -- and a definite lack of core skills with ruby -- that I am wondering how to address. Not only would I like an answer, I would welcome opinions on whether or not there is a better way to achieve this.

Associations:

We have a Client class which has_many :users. The User belongs_to the Client.

In addition to the :client_id column we also have a :email column that should be unique within the scope of the :client_id

Validations:

I have seen that I could do something like this to ensure that on the instance level by adding this check to the User model.

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

but as far as my understanding goes, this does nothing to ensure uniqueness in the schema. Keep in mind I am trying to avoid manually altering the schema with SQL, I would like to do this with migrations if possible. In other uniqueness checks(for non scoped uniqueness), to ensure the uniqueness of something I would do something like this in the migration:

add_index :users, :email, unique: true

but that doesn't really do what I want, I don't think.

Tips, tricks, comments, suggestions, and answers welcome!

Edit: MySQL example:

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

1 Answer 1

2

You can use an array as the second argument to add_index in your migration:

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

This should produce:

CREATE UNIQUE INDEX users_client_id_email ON users(client_id, email)

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

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.