Несколько минут назад я задал вопрос: создайте уникальные ограничения для каждого пользователя и ответ было очень просто.
Для создания уникального индекса для столбца, но для каждого пользователя, все, что мне нужно сделать, это:
unique [:user_id, :name] # SQL syntax: UNIQUE (user_id, name)
Но отношение между пользовательской таблицей и таблицей, которая ссылается на user_id
, является 1:n (пользователь к местоположению), поэтому у меня есть foreign_key
внутри таблицы location
, которая ссылается на user_id
. Этот вопрос касается отношения n:m между двумя таблицами и добавления уникального ограничения для одной из таблиц.
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :customer do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
DateTime :created_at
DateTime :updated_at
index :id, :unique => true
end
end
end
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :role do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
String :name, :unique => true, :null => false # TODO: unique, per customer
DateTime :created_at
DateTime :updated_at
unique [:customer_id, :name]
index :id, :unique => true
full_text_index :name, :index_type => :gist
end
end
end
В приведенном выше коде показано, что две таблицы, о которых я упоминал, имеют отношение n:m (клиент к роли), следующая таблица иллюстрирует таблицу соединения с внешними ключами для обеих таблиц:
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :customer_role do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
foreign_key :customer_id, :customer, :type => :uuid
foreign_key :role_id, :role, :type => :uuid
index :id, :unique => true
end
end
end
Что я хотел бы сделать, так это объявить уникальное ограничение, такое как UNIQUE (customer_id, :name)
, для таблицы role
. Но я не могу этого сделать, так как же мне добиться этого другим способом?