ruby on rails, указывающий уникальность в дБ для нескольких столбцов - PullRequest
1 голос
/ 01 июня 2011

У меня модель выглядит следующим образом:

class EntityTag < ActiveRecord::Base
  attr_protected :user_id, :post_id, :entity_id

  belongs_to :user
  belongs_to :post
  belongs_to :entity

  validates :user_id, :presence => true
  validates :entity_id, :presence => true
  validates :post_id, :presence => true
end

Я хочу защититься от нескольких строк, которые имеют одинаковую комбинацию user_id, entity_id и post_id (например, все три значения имеют уникальный идентификатор для строки).

Какой самый простой способ сообщить об этом ActiveRecord?

Ответы [ 2 ]

7 голосов
/ 01 июня 2011

Как упомянуто @dhruvg:

validates_uniqueness_of :user_id, :scope => [:entity_id, :post_id]

Обратите внимание, что проверка уникальности на уровне модели НЕ гарантирует уникальность в БД. Чтобы иметь это, вы должны поместить в таблицу уникальный индекс.

Добавьте следующее в ваши миграции.

add_index :entity_tags, [:user_id, :post_id, :entity_id], :unique => true
0 голосов
/ 01 июня 2011

Я бы проверил это в действии create вашего контроллера.

EntityTag.where(["user_id = ? and entity_id = ? and post_id = ?",
  params[:user_id], params[:entity_id], params[:post_id]]).all

вернет Array любой существующей записи, имеющей те же значения. Если Array.count == 0, то вы можете продолжить сохранение вновь созданного объекта как обычно. В противном случае вы можете либо вернуть существующую запись, либо выдать ошибку; вам решать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...