Рельсы Модели и уникальные комбинации - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть приложение Rails, у которого есть таблица с именем friendrequests. Это выглядит так:

user1_id:integer user2_id:integer hasaccepted:boolean

Я создаю опцию добавления друзей, но запрос на добавление в друзья можно отправить только один раз. Таким образом, вы не можете иметь что-то подобное в данных базы данных:

user1_id | user2_id | hasaccepted
       1 |        2 |       false
       1 |        2 |       false

или

user1_id | user2_id | hasaccepted
       1 |        2 |       false
       2 |        1 |       false

Комбинация user1_id / user2_id должна быть уникальной, а не сами столбцы, поэтому это будет возможно:

user1_id | user2_id | hasaccepted
       1 |        2 |       false
       1 |        3 |       false

Можно ли определить это в модели? Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 18 февраля 2010

Для первого случая в вашей модели FriendRequest используйте validates_uniqueness_of(:user1_id, :scope => :user2_id). Вам также может понадобиться обратное. Во втором случае я переопределяю #validate в FriendRequest и проверяю там (см. Документацию API для получения подробной информации о том, как метод должен работать).

0 голосов
/ 19 февраля 2010

Я также обязательно добавлю индекс в саму базу данных. Проверка достоверности в модели не может использоваться для сохранения целостности данных, поскольку в параллельной системе существуют крайние случаи, когда проверка не защитит вас.

например, другая запись может быть вставлена ​​после проверки достоверности, но до создания новой записи:

  1. Модель A: проверка (проходной)
  2. Модель B: проверка (прохождение)
  3. Модель A: Вставка (успех)
  4. Модель B: вставка (успех: неверные данные)
0 голосов
/ 18 февраля 2010

Попробуйте это:

  validates_each :user1_id, :user2_id  do |record, attr, value|
    if FriendRequest.exists?( :user1_id => [record.user1_id, record.user2_id], 
               :user2_id => [record.user1_id, record.user2_id])
        record.errors.add attr, 'Duplicate friend request'
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...