2011-10-13 52 views
2

我是ROR新手,一直试图通过mike hartl的教程(我可能会添加优秀的阅读初学者)摸索自己的方式。然而,有一些我正在努力,我的用户模型如下所示。Rails领域的唯一性约束红宝石

class User < ActiveRecord::Base 

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

然后我用Rails -c打开红宝石控制台,并通过使用

usr.save 

创建一个新用户

usr = User.new(:name=>"abcd",:email=>"[email protected]") 

然后我将它保存这在我的数据库中创建一个新的记录。到目前为止很好。但如果我再次输入 usr.save ,没有任何反应,我查看数据库(sqlite),甚至没有更改最后更新日期。

另一个有趣的事情,我注意到的是,当我使用

User.create(:name=>"abcd",:email=>"[email protected]"), 

多次,有一个记录创建每次我在控制台运行时间。

有人可以解释为什么我的保存不起作用,以及为什么我的唯一性约束被忽略?

在此先感谢

回答

2

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有验证错误(如重复的电子邮件)并且未保存,则会看到异常。

+0

感谢您的回答。创建确实在我的表中创建了多个记录。对validate_uniqueness_of函数的更改修复了创建。每当我更改代码或者自动处理时,是否应该退出并重新打开导轨控制台。 – user993797

+0

哦,是的,这将做到这一点。例如,当您更改代码或至少运行'load user.rb'时,您需要重新加载控制台以重新加载更改的类。虽然当你这样做的时候事情会变得有点怪异(例如验证会被包括在内,并且随后会多次运行)。 – numbers1311407

+0

@ user993797你可以在'rails console'中输入'reload!',它会重新加载(几乎)所有的东西。 –