Ограничение уникальности ruby ​​на рельсовом поле - PullRequest
2 голосов
/ 13 октября 2011

Я новичок в ROR и пытаюсь пробраться к учебнику Майка Хартла (отличное чтиво для начинающих, я мог бы добавить). Однако есть кое-что, с чем я борюсь, моя пользовательская модель выглядит следующим образом.

class User < ActiveRecord::Base

    validates :name , :presence => true, :length => {:maximum => 50 }
    validates :email, :presence   => true,
                    :format     => { :with => email_regex },
                    :uniqueness => true
end

Затем я открываю консоль ruby ​​с помощью rails -c и создаю нового пользователя

usr = User.new(:name=>"abcd",:email=>"svsvenu@gmail.com")

Затем я сохраняю его, используя

usr.save

Это создало новую запись в моей базе данных. Пока все хорошо. Но если я наберу usr.save опять ничего не происходит, я смотрю на базу данных (sqlite) и даже дата последнего обновления не изменилась.

Еще одна интересная вещь, которую я заметил, когда я использую

User.create(:name=>"abcd",:email=>"svsvenu@gmail.com"),

несколько раз, запись создается каждый раз, когда я запускаю ее в консоли.

Может кто-нибудь объяснить, почему мое сохранение не работает, а также почему игнорируется мое ограничение уникальности?

Заранее спасибо

1 Ответ

2 голосов
/ 13 октября 2011

ActiveRecord достаточно умен, чтобы понимать, что когда вы набираете usr.save два раза подряд, второй является избыточным.

usr = User.new
usr.save # usr is saved (if it was valid)
usr.save # usr is already saved and unchanged!  do nothing.
usr.name = "bananas"
usr.save # usr name changed, commit the change!

Когда вы говорите, что пользователь создается в консоли каждый раз, когда вызапустить User.create, вы уверены, что они на самом деле создаются?В консоли вы увидите User, возвращаемое каждый раз, но id будет nil, если в попытке создания были ошибки.Если вместо этого вы запустите create!, вы увидите исключение, если User имел ошибки проверки (например, дубликат электронной почты) и не сохранил.

...