Вы можете использовать validates
для проверки uniqueness
на одной колонке:
validates :user_id, uniqueness: {scope: :friend_id}
Синтаксис для проверки на несколько столбцов похож, но вы должны вместо этого введите массив полей:
validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
Однако, подходы к проверке, показанные выше, имеют состояние гонки и не могут обеспечить согласованность. Рассмотрим следующий пример: записи в таблице
базы данных должны быть уникальными по п полей;
несколько (два или более) одновременные запросы, обрабатываемые отдельные процессы каждый (серверов приложений, фон рабочие серверов или что вы используете), доступ к базе данных, чтобы вставить ту же запись в таблице;
каждый параллельный процесс проверяет, есть ли запись с тем же n поля;
Валидация для каждого запроса успешно передана, и каждый процесс создает запись в таблице с теми же данными.
Чтобы избежать такого поведения, следует добавить уникальное ограничение к таблице БД.Вы можете установить его с add_index
помощником для одного (или несколько) поля (ы) с помощью следующей миграции:
class AddUniqueConstraints < ActiveRecord::Migration
def change
add_index :table_name, [:field1, ... , :fieldn], unique: true
end
end
РИСКОВАННОЙ: даже после того, как вы установили ограничение уникальности, два или более одновременных запросов будут попробуйте написать одни и те же данные в БД, но вместо того, чтобы создавать дубликаты записей, это вызовет ActiveRecord::RecordNotUnique
исключение, которое следует обрабатывать отдельно:
begin
# writing to database
rescue ActiveRecord::RecordNotUnique => e
# handling the case when record already exists
end
простите меня, если я плотный, но как это поможет в этой ситуации? – re5et
попробуйте использовать «validates_uniqueness_of» в вашей модели. если это не работает, попробуйте создать индекс, на котором вы можете создать миграцию feilds, которая включает в себя инструкцию типа add_index: table, [: column_a,: column_b],: unique => true) –
@HarryJoy, он спросил: Есть рельсовые пути ». И вы предлагаете ему путь без рельсов, но стандартный. 'Способ Active Record утверждает, что интеллект принадлежит вашим моделям, а не в базе данных.' – Green