Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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_Activerecord - Fatal编程技术网

Ruby on rails 我可以在rails中使已验证的唯一性失败吗?

Ruby on rails 我可以在rails中使已验证的唯一性失败吗?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,标题拥有一切 我希望列上有一个唯一的约束,但如果一个记录试图用该约束创建,就失败了 或者。。。我应该只使用first\u或\u initialize/first\u或\u create吗?是的,您应该使用first\u或\u create 以下是一个例子: Client.where(:first_name => 'Andy').first_or_create(:locked => false) # => #<Client id: 1, first_name: "Andy"

标题拥有一切

我希望列上有一个唯一的约束,但如果一个记录试图用该约束创建,就失败了


或者。。。我应该只使用first\u或\u initialize/first\u或\u create吗?

是的,您应该使用first\u或\u create 以下是一个例子:

Client.where(:first_name => 'Andy').first_or_create(:locked => false)
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27">
Client.where(:first\u name=>'Andy')。first\u或\u create(:locked=>false)
# => #

first\u或\u create
/
first\u或\u initialize
用于返回现有记录/实例,而不是创建/实例化新记录/实例。如果这是你想要的行为,那么也许你应该走那条路


此答案其余部分的简短版本:“为什么要编写一个被忽略的约束?这听起来很可疑。”

但是既然你说你想让它失败,请考虑以下内容:

如果它是静默的,约束的意义是什么?这会隐藏一个问题,而你不希望这样。你的app/DB就像“嘿,伙计,你告诉我要总是拒绝这个非唯一的废话,但现在你改变主意了?”你用这些失败来保持数据的有效性,并将错误传递给用户,以便他们能够纠正

如果你只需要在某些情况下强制执行唯一性,但是在其他情况下避免它是可以的(这很奇怪,但我听说过更奇怪),那么你需要认真考虑这段代码的设计。如果您可以明确地说,“这应该是唯一的,或者永远都是唯一的,或者永远不关心是否是唯一的,一个或另一个。”如果这是您需要的,那么您必须在DB级别删除任何唯一性约束(因为您不能有条件地忽略这些约束)并在Rails模型级别将其作为条件约束。但是如果你走这条路,一定要非常小心。一旦您的表中有了非唯一的数据,您将无法在需要时轻松返回,并且您可能会将您未来的自己描绘成无效数据的可怕角落

如果唯一性约束因非用户提供的数据而失败(即,您在应用程序中创建的记录完全独立于任何类型的用户输入),则您的代码中有一个错误,应解决该问题,因为您应该能够100%地防止自己的代码中出现唯一性约束错误

如果这是一个临时事件,可能您正在创建一个基于第三方数据源的记录,该数据源已损坏/存在错误,但您现在无法修复或无法控制它,但您需要您的应用程序继续工作,如果您就您的情况问一个更具体的问题,可能会有所帮助,因为临时解决方案是它们自己的一个类别。有些是经过合理设计的变通方法或补丁,而另一些则往往成为可怕的黑客,这将花费您的维护时间