Ruby и Datamapper проверяют, существует ли запись и где?

У меня есть базовое приложение Ruby, которое я создаю с помощью Sinatra, Datamapper и аутентификации пользователя с использованием OAuth. Когда я получаю данные от службы Oauth, я сохраняю запись нового пользователя в базе данных sqlite3.

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

У меня есть 2 класса и маршрут /callback. Класс User — это модель базы данных, а класс Authentication имеет различные методы подключения к OAuth и маршрут /callback, который будет иметь вызывается метод Authentication.save.

Должен ли я проверять существующую запись в методе Authentication.save и возвращать логическое значение или что-то еще? Создать новый метод в Authentication, похожий на Authentication.exists? (и как это будет выглядеть?) Или я должен проверять маршрут /callback?

Я прошу прощения, если это не было на 100% ясно, мне трудно описать свою проблему, и я абсолютный новичок в Ruby...


person kylemac    schedule 18.11.2009    source источник


Ответы (1)


Непосредственно перед созданием нового пользователя вы должны попытаться проверить, существует ли пользователь с таким же логином и адресом электронной почты (например):

require 'dm-aggregates'

user=User.new
user.login=your_login_data_returned_by_oauth
user.email=your_email_data_returned_by_oauth
# And so on...
user.save if User.count(:login=>user.login, :email=>user.email) == 0
person Yoann Le Touche    schedule 18.11.2009
comment
Я не уверен, но похоже, что потенциально полная коллекция объектов для проверки существования регистра не является оптимизированным решением. Я заменю условие на if User.count(:login=>user.login, :email=>user.email) == 0. - person fguillen; 02.11.2011
comment
User.count лучше, я не знаю, почему я не упомянул об этом, потому что я всегда так делаю. - person Yoann Le Touche; 14.11.2011
comment
С другой стороны, user.count не работает: stackoverflow. com/questions/14393004/ . меня тоже это укусило - person codeObserver; 20.06.2013