我刚开始尝试使用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
提前感谢您的帮助!
答案 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>