【发布时间】:2016-04-19 20:17:06
【问题描述】:
我正在尝试通过查询处理大量 (+100,000) 条记录。
我正在使用类似的东西:
BigRecordPull.where(name: ['x','y','z']).each { |record| do_some_action record }
因为从内存管理的角度来看这并不好,我想改用 find_each 概述 here 所以现在代码如下所示:
BigRecordPull.where(name: ['x','y','z']).find_each { |record| do_some_action record }
问题是当我触发代码时,我收到以下错误:
ActiveRecord::JDBCError: 错误: 运算符不存在: 字符变化 >= 整数 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
如果我查看在日志中创建的 SQL 查询,我会得到如下信息:
SELECT "big_record_pull".* FROM "big_record_pull" WHERE "big_record_pull"."name" IN ('x','y','z') AND ("big_record_pull"."name" >= 0)
ActiveRecord 似乎添加了部分,'AND ("big_record_pull"."name" >= 0)' 这似乎是导致问题的原因。此示例中的名称是 varchar。额外的皱纹是我不控制我的 rails 项目插入的 postgresql db,所以我不能只是重新运行迁移来尝试解决这个问题。我希望有一些解决方法......我想避免运行原始 SQL。
额外信息 在上面的例子中,big_record_pull.name 也是一个 foreign_key
【问题讨论】:
-
name是表的主键吗?
-
name 将是另一个表的 foreign_key... 这可能看起来有点混乱。假设 big_record_pull 是一个具有 3 个属性的表,id 是主键,name 是外键(varchar),description 是 varchar(用于咯咯笑)。无论您搜索名称还是描述,sql 查询都是相似的,因为它创建了我不想要/不需要的额外 big_record_pull.name >= 0 部分
-
很奇怪。如果主键(在 rails 模型中)设置为 name 而不是默认的 id,我只会期望/理解上述内容
-
@FrederickCheung,你是对的,在查看了我的模型之后,名称被用作这个特定表的主键的一部分,并作为另一个表的外键......你可能已经猜到我试图用一个简单的例子来制作一个更复杂的表格......抱歉造成混淆。
标签: ruby-on-rails ruby-on-rails-3 activerecord