Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-强制字段大写并唯一验证_Ruby On Rails_Ruby On Rails 3_Activerecord_Validation - Fatal编程技术网

Ruby on rails Rails-强制字段大写并唯一验证

Ruby on rails Rails-强制字段大写并唯一验证,ruby-on-rails,ruby-on-rails-3,activerecord,validation,Ruby On Rails,Ruby On Rails 3,Activerecord,Validation,机场有四个字母的国际民航组织代码。按照惯例,这些都是大写的。我正在创建一个表单来接收用户输入,但是这个表单需要能够在混合情况下接受用户输入,并防止他们创建重复 默认的:唯一性当然是区分大小写的。我知道如何在保存用户输入之前将其转换为大写,但问题是这似乎是后验证,而不是预验证 例如,如果已经有一个机场的ICAO为KLAX,用户可以输入KLAX,它将被验证为唯一的,然后转换为大写并存储,从而产生重复 这是我目前的模型代码 class Airport < ActiveRecord::Base

机场有四个字母的国际民航组织代码。按照惯例,这些都是大写的。我正在创建一个表单来接收用户输入,但是这个表单需要能够在混合情况下接受用户输入,并防止他们创建重复

默认的
:唯一性
当然是区分大小写的。我知道如何在保存用户输入之前将其转换为大写,但问题是这似乎是后验证,而不是预验证

例如,如果已经有一个机场的ICAO为
KLAX
,用户可以输入
KLAX
,它将被验证为唯一的,然后转换为大写并存储,从而产生重复

这是我目前的模型代码

class Airport < ActiveRecord::Base
  validates :icao, :name, :lat, :lon, :presence => true
  validates :icao, :uniqueness => true

  before_save :uppercase_icao

  def uppercase_icao
    icao.upcase!
  end
end
class Airporttrue
验证:icao,:唯一性=>true
保存前:大写字母
def大写字母_国际民航组织
国际民航组织,快!
结束
结束
试试这个:

validates :icao, :uniqueness => { :case_sensitive => false }

简单地解决了(Rails的许多问题)-正如Danny在上面指出的,虽然不是在他自己的答案中,所以我不能接受:),将保存之前的
更改为验证之前的
可以很好地修复它。

或稍微不同的做法:为
icao
编写一个setter,将抛出的任何内容转换为大写:

def icao=(val)
    self[:icao] = val.upcase
end
然后可以使用常规唯一性验证()。甚至可能使DB在查找过程中变得更容易,因为它不再需要担心不区分大小写的比较


希望这有帮助

Rails 4的更新答案

class Airporttrue
验证:icao,:唯一性=>{区分大小写:false}
def icao=(val)
写入属性:icao,val.upcase
结束
结束

或者在保存之前进行验证,而不是在保存之前进行验证:)很好,Danny-验证之前正是我所需要的。谢谢,这也是一种有趣的处理方式。出于某种原因,我也没有假设我需要手动索引我的字段,所以很高兴知道这一点。很容易做到,但很重要!谢谢