当前位置: 首页 > 知识库问答 >
问题:

唯一性验证的选择请求没有WHERE条件

朱兴安
2023-03-14

我搜索了4天关于这个问题,我在ActiveRecord和使用唯一性验证方面遇到了一些问题。我无法在控制台或测试中创建至少包含一个唯一性验证的模型。但是,我可以使用rails服务器(API)创建对象。

这让我发疯了!这是从我把Rails3项目升级到Rails4开始的。

  • Rails 4.0.15
  • Ruby 2.2.0
  • Factory女孩Rails 4.6.0
  • RSpec 3.4.1
  • PG 0.18.4
class ContainerType < BaseModel

  has_many :containers, :inverse_of => :container_type, :dependent => :restrict_with_exception

  validates :name, :length => { :minimum => 1, :maximum => 25 },
                   :presence => true,
                   :uniqueness => true
end

< code>BaseModel是一个抽象,包含一些所有模型通用的< code>include。

class BaseModel < ActiveRecord::Base
  self.abstract_class = true

  include [...]
end

< code > test = container type . last . dup

ContainerType Load (0.7ms)选择“container_types”。*从“容器_类型”开始按“容器_类型”排序。“id”desc限制1

<代码>

<code>test.save

(0.3ms)BEGIN
ContainerType存在(0.4ms)SELECT 1 AS one from"container_types"LIMIT 1
(0.3ms)ROLLBACK
ActiveRecord::记录无效:验证失败:名称已从 /home/dev/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.1.15/lib/active_record/validations.rb:57中获取
:在'保存!'

对于有效的容器类型:

ContainerType.delete_all
ContainerType.create!(name: 'my container type 1 !')

(0.3ms)BEGIN
ContainerType存在(0.4ms)SELECT 1 AS one from"container_types"LIMIT 1
(0.3ms)ROLLBACK
ActiveRecord::记录无效:验证失败:名称已从 /home/dev/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.1.15/lib/active_record/validations.rb:57中获取
:在'保存!'

您可能注意到验证的选择请求没有条件。我确信这与ActiveRecord或不兼容的宝石有关,但我找不到原因....

其他测试 :

container_type = ContainerType.where(name: 'my container type 1 !').first_or_create  

容器类型加载(0.6ms)选择container_types。*从"container_types"所在位置"container_types"。"名称"='我的容器类型1!'由"container_types"订购。"id"ASC LIMIT 1
(0.1ms)BEGIN
容器类型存在(0.3ms)选择1作为一个从"container_types"LIMIT 1
(0.2ms)回滚

p container_type.inspect  

<代码> " #

测试

  • 什么可以使唯一性验证创建无条件的SQL请求
  • 你已经看到这个了吗

经过一些调查,我尝试了:-在所有before_*回调上添加< code > return true -创建一个用于唯一性验证的自定义验证器-我生成一个支架模型来检查它是否与我的泛型includes相关。

它似乎与models属性有关,随着rails更新,我将StrongParameter添加到了控制器中。但模型可能仍在使用某种受保护的属性遗迹。

共有1个答案

晋功
2023-03-14

好吧,我的实习生发现了为什么它不起作用,它来自项目中的一个monkey_patch。从初始值设定项加载的库正在重写ActiveRecord::Relation类。。。

 类似资料:
  • 问题内容: 在mysql表中,我有: ID,名称,城市,日期,状态 我想从“信息”中选择所有名称 好吧,结果是它返回了所有条目。我想回显所有没有重复的条目。 说:在原始的“名称”下,我们已经将名称“ John”插入了10次。 我只想回声一次。这可能吗? 问题答案: 很简单: SQL关键字可以解决问题。

  • 我有一个设置为接收来自WooCommerce的网络钩子的Rails应用程序。具体来说,我正在寻找创建订单的时间。我已经测试并验证了它在我protect_from_forgery时是否有效,除了创建。现在我正在尝试通过验证网络钩子来保护我的应用程序。WooCommerce的留档声明在请求标头中传递以下秘密: 秘密:一个可选的密钥,用于生成请求正文的HMAC-SHA256哈希,以便接收者可以验证Web

  • 本文向大家介绍yii2 从数据库验证唯一值:唯一验证,包括了yii2 从数据库验证唯一值:唯一验证的使用技巧和注意事项,需要的朋友参考一下 示例 如果输入现有值,某些人会遇到有关无法显示错误消息的问题。例如,我不允许用户使用现有电子邮件进行注册。 视图 控制者 模型            

  • 问题内容: laravel 4文档提到了唯一的字段验证。他们在这里说明了如何在唯一验证中包含where子句。唯一表的单个WHERE子句,例如: http://laravel.com/docs/validation#rule-unique 现在,我假设这样做是这样的: 然后检查此查询是否返回结果,如果没有通过验证器。 所以我想知道是否有一种方法可以添加更多的where子句?如果是这样怎么办? 问题答

  • 问题内容: 我有一个laravel 模型,该模型在和上具有唯一的验证规则。在我的存储库中,当我更新模型时,我将重新验证字段,以使所需的规则验证没有问题: 测试失败 有没有办法优雅地解决这个问题? 问题答案: 将当前正在更新的实例的追加到验证器。 传递实例的来忽略唯一的验证器。 在验证器中,使用参数来检测您是否正在 更新 或 创建 资源。 如果进行更新,则强制唯一规则忽略给定的id: 如果创建,请照

  • 问题内容: 我正在尝试将API查询输入python。命令行 提供一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python进行此调用,以便我可以遍历不同的id并分析输出。有任何想法吗?在需要身份验证之前,我已经使用urllib2进行了此操作。我也查看了请求模块,但无法弄清楚该怎么做。 非常感谢。 问题答案: 该请求包有一个用于HTTP请求的一个非常好的API,加入了自定义