问题标签 [dynamic-finders]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
375 浏览

grails - Grails 动态查找器会被应用程序代码破坏吗?

我正在处理的项目中有一些代码,其中动态查找器在一个代码分支中的行为与在另一个代码分支中的行为不同。

这行代码返回我所有的广告商(其中有 8 个),无论我在哪个分支。

但是当我开始添加条件时,事情变得很奇怪。在分支 A 中,以下代码返回我的所有广告客户:

但在分支 B 中,该代码仅返回 1 个广告客户。

应用程序代码的更改似乎不可能影响动态查找器的工作方式。我错了吗?还有什么可能导致这不起作用吗?

编辑

我被要求发布我的班级定义。我不会发布所有内容,而是发布我认为重要的部分:

此代码存在于分支 B 中,但在分支 A 中不存在。当我将其拉出时,事情现在按预期工作。

我决定用这个代码做更多的挖掘,看看我能观察到什么。当我使用withCriteria而不是动态查找器时,我发现了一些有趣的东西:

Advertiser.withCriteria{owner{idEq(ownerInstance.id)}}

我发现这返回了数千个重复项!所以我尝试使用listDistinct

Adviertiser.createCriteria().listDistinct{owner{idEq(ownerInstance.id)}}

现在这将返回我的所有 8 个广告商,没有重复。但是如果我试图限制结果呢?

现在这会返回一个结果,就像我的动态查找器一样。当我加速maxResults到 100K 时,现在我得到了全部 8 个结果。

那么发生了什么?似乎连接或急切获取(或两者)生成的 sql 返回了数千个重复项。默认情况下,Grails 动态查找器必须返回不同的结果,所以当我不限制它们时,我没有发现任何奇怪的东西。但是一旦我设置了一个限制,由于记录是按 ID 排序的,前 25 条记录都将是重复记录,这意味着只会返回一个不同的记录。

至于joins和eager fetching,我不知道代码试图解决什么问题,所以我不能说是否有必要;问题是,为什么在我的班级中有这段代码会产生这么多重复?

0 投票
0 回答
922 浏览

unit-testing - Grails 单元测试 - 测试使用 findAllBy* 方法的服务

我们在一个项目上有 Grails 2.2.1。我想测试一项服务。在这项服务中,我使用了一个动态查找器(findAllBy...),但是在使用域模拟的单元测试中使用这个查找器的结果是一个 EmptyList。但是当我查看 UserRole.list() 时,同一用户有 3 个 UserRoles。似乎 Domain.findAllBy... 在模拟域中被破坏了。

Domain 类如下所示:

测试看起来像:

服务看起来像:

0 投票
2 回答
606 浏览

activerecord - Rails 4 Active Record 查找器方法

我有一个 Rails 3 Active Record finder 方法,我正在尝试将其更新为 rails 4 patten。

在 Rails 3 中,我的代码看起来像这样

在 Rails 4 中,我试过这个,这段代码正确吗?

0 投票
1 回答
498 浏览

ruby-on-rails - Rails 动态查找器偶尔不起作用

我有一个问题,在我的 Ruby on Rails 应用程序中使用的动态查找器几乎总是可以工作,但很少会抛出 NoMethodError。

这是出现问题时异常堆栈的副本:

导致抛出异常的代码(supergroup_instance 第 394 行):

SasUi::Event 是 SasUi 的子类,它是 ActiveRecord::Base 的子类。

这是数据库条目:

这在 99.99% 的情况下都有效,我们有几百个客户在使用这个软件,但非常偶尔,一个客户会看到这个问题。注销应用程序并重新登录似乎可以解决问题。

应用程序中有多个线程访问这些模型,这是另一种可能的探索途径。

据我了解,动态查找器通过覆盖缺少方法的方法,并在 _ 字符上拆分被调用方法的名称以提取请求的属性名称来工作。如果提取的属性存在于模型的attribute_names中,则进行查询,否则将抛出原始的NoMethodError。

attribute_names 具有以下文档:

如果它不是抽象类并且表存在,则将列名数组作为字符串返回。否则返回一个空数组。

除了上面列出的例外,postgres 日志或应用程序日志中没有提示性条目。

我最初的想法是可能存在一些间歇性数据库问题,由于某种原因 postgres 报告该表不存在。重新启动应用程序不会重新启动数据库,但会解决问题。

我想知道它是否可以归结为rails缓存表,并且该缓存以某种方式被破坏。

有没有人见过这个或知道什么会导致这种情况发生?或者,将不胜感激有关任何进一步诊断步骤的任何建议。

我知道这些查找器在最近的版本中已被弃用,但迁移到新版本不是此版本软件的选项,我想深入了解它,以防它表明一些更深层次的问题。

以下是软件版本/平台:

如果原因与自动加载有关,请添加更多信息:

0 投票
1 回答
749 浏览

grails - 如何编写寻找 0 或 null 的 grails 动态查找器

编写用于搜索等于 0 或为空的标志的 Grails 动态查找器的最佳方法是什么?

例子

isArchived 可以为空。所以查询要么在寻找 isArchived = 0,要么如果它为空,它也希望它出现在结果中。

编辑:乍一看,这个问题似乎我什至没有尝试,也没有看文档。我向你保证,我一直在研究和尝试许多不同的事情。

另外,是的,数据库中的布尔标志不应为空,但此时无法更改表。在这种情况下,开发人员依赖于在域对象中将标志的值默认设置为 0。虽然这在大多数情况下都有效,但在某些情况下标志被设置为空。

我使用动态查找器尝试了许多不同的方法来执行此操作,但似乎不可能在动态查找器中使用同一列两次。

我会接受答案,“不,使用动态查找器是不可能的,只需使用 createCriteria() 方法。” 我只是想确定这是否不可能。

0 投票
2 回答
193 浏览

grails - 是否可以限制动态查找器?

想象一下,您有一个具有出色服务层的 Grails 项目,并且您希望确保您的团队仅通过您的服务访问模型。

是否可以轻松地限制动态查找器,以便它们仍然可以在服务内部(相同的包)使用,但不能在外部使用?

我可以想象覆盖它们,但随后它们也消失了服务......

0 投票
1 回答
491 浏览

grails - Grails findBy belongsTo 给出 JdbcSQLException

比如说,对于一个系统,我有 Student 和 User 对象,如下所示:

我有很多针对这些模型编写的代码,其中还有很多动态查找器

这一切都很好。但我想更新我的域模型以添加从用户到学生的级联访问。所以我做了:

我会像这样保存一个用户:

但问题是,当我尝试像上面那样访问“s”时。

如果Student.findByUser可以找到一个这样的学生,那么它就可以工作。
但是如果它应该返回 null,它会给出一个错误。

将导致:

我知道我可以通过user.student之类的用户对象访问学生对象,但我希望能够保持现有代码不变。

我看过这个帖子,它也有类似的问题,但没有解决grails 电子邮件列表


这是一个错误吗?我能做些什么来绕过它?我没有正确设置我的域模型吗?

谢谢

0 投票
2 回答
1694 浏览

grails - Grails:findAllWhere 排序/最大/偏移运算符不起作用

我知道 grails 中的动态查找器仅支持 2 个参数,例如。

因此,要使用超过 3 个参数,我找到了这个示例并且它有效。但是我需要使用 max 和 offset 运算符。

但是,这会返回整个列表,而不是要求的限制。操作员是否为 findAllwhere 工作?如何使用它或将我的发现限制在一定范围内?

0 投票
2 回答
857 浏览

grails - Grails findById(null) 返回“随机”结果

我今天在我们的 grails 应用程序中发现了一个非常奇怪的行为,我想与您分享。

我们在 mysql 5.1.48 上使用 grails 2.3.11。

我们 DomainObject.findById( id )在您的控制器操作之一中进行了操作。我们未能检查 id 是否为空值,因此DomainObject.findById( null ) 当没有 id 作为参数传递时会调用它。

通常DomainObject.findById( null ) 会返回 null 但有一个特殊条件会产生其他结果!

如果之前调用的控制器操作在数据库中插入了一条新记录(我们称之为对象 B),则无论存储的域对象如何,DomainObject.findById( null )都会找到与对象 B 插入时具有相同 ID 的DomainObject 。

因此,当在保存任何内容之前调用的控制器操作findById(null)将返回一行。并且该行将具有与最后插入的元素相同的 id。

我完全知道使用findById(null)不是理想的方法,但我对它产生的结果感到非常震惊。但是返回任何看似“随机”的结果对我来说似乎很奇怪。

我还想指出,DomainObject.get(null)不会遭受这个问题。

其他人见证了这一点吗?

有一个活跃的 Jira 指向这个方向:https ://jira.grails.org/browse/GRAILS-9628但它并没有真正描述这个问题。

0 投票
1 回答
333 浏览

grails - 如何覆盖 grails 动态查找器?

假设我有一个Person带有name字段的课程。我可以做一个Person.findByName,但是如果我想重写这个方法以确保查询被缓存怎么办?如何覆盖此动态查找器方法?