在轨道4.2上的Activerecord唯一性验证ruby

时间:2015-12-19 10:23:05

标签: ruby-on-rails-4 rails-activerecord

我刚开始尝试使用Ruby on rails。我创建了一个模式状态,并希望每个州名都必须保持唯一,所以我使用了

uniqueness: true

根据http://guides.rubyonrails.org/active_record_validations.html。 正如上面的文档所说,在调用object.save时会自动调用验证。但是当我尝试使用相同的state_name值保存对象时,不会抛出异常并保存记录。我可以帮助我做错了。

型号代码

class State < ActiveRecord::Base
  acts_as_paranoid
  validates_presence_of :state_name ,uniqueness: true
end

控制器代码

def create
 @stateName = params[:stateName];
 @state = State.new();
 @state.state_name=@stateName;
 if(@state.save())
   resp = { :message => "success" }
 else
   resp = { :message => "fail" }
 end

 respond_to do |format|
   format.json  { render :json => resp } 
 end
end

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果您想要进行唯一性检查,请更改

validates_presence_of :state_name ,uniqueness: true

validates :state_name, uniqueness: true

如果您想要唯一性和状态检查两者,请使用

validates :state_name, uniqueness: true, presence: true

下面显示了替代语法,syntax shown above should be preferred

validates_uniqueness_of :fname
validates_presence_of :fname

此外,根据documentation,请注意关于uniqueness: true的使用情况

  

它不会在数据库中创建唯一性约束,因此它可能会   发生两个不同的数据库连接创建两个记录   您想要唯一的列的相同值。避免   那个,你必须在数据库的两个列上创建一个唯一的索引。

     

通过在模型中执行SQL查询来进行验证   表,搜索具有相同值的现有记录   属性。

这意味着如果多个用户同时尝试同时保存记录,则可能会在每个state_name发生在不同线程上时创建重复save的记录< / p>