ruby-on-rails - 奇怪的 Rails ActiveRecord 行为
问题描述
有人可以解释为什么以下查询返回差异结果吗?
如果我运行一个简单的“最后”查询,我会得到一个对象。
>> j = Job.last
(1.6ms) SELECT sqlite_version(*)
Job Load (0.7ms) SELECT "jobs".* FROM "jobs" ORDER BY "jobs"."id" DESC LIMIT ? [["LIMIT", 1]]
=> #<Job id: 12, customer_id: 3, description: nil, shoot_start_date: "2020-11-25
00:00:00", shoot_end_date: "2020-11-26 00:00:00", submission_deadline: "2020-11-27
00:00:00", delivery_deadline: "2020-11-28 00:00:00", created_at: "2020-11-25 21:44:22",
updated_at: "2020-12-14 19:30:06", token: "fd2356c1-996b-4f95-b24a-8c92829af1fe", name:
"teesting">
有了这个对象,我可以得到孩子如下:
>> j.job_entries
JobEntry Load (0.7ms) SELECT "job_entries".* FROM "job_entries" WHERE
"job_entries"."job_id" = ? LIMIT ? [["job_id", 12], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<JobEntry id: 8, entity_id: 12,
agency_id: 35, created_at: "2020-12-07 21:27:47", updated_at: "2020-12-07 21:27:47", job_id:
12, job_role_id: 8>, #<JobEntry id: 9, entity_id: 13, agency_id: 35, created_at: "2020-12-14
17:35:30", updated_at: "2020-12-14 17:35:30", job_id: 12, job_role_id: 7>]>
但是,当我在我的对象上运行一个方法时,它是以下代码:
def self.getJobAndSubmissions(token)
Job.includes(job_entries: :images_attachments).where(:token => token)
end
我得到了与附件完全相同的记录:
>> j = Job.getJobAndSubmissions('fd2356c1-996b-4f95-b24a-8c92829af1fe')
Job Load (0.9ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."token" = ? LIMIT ? [["token",
"fd2356c1-996b-4f95-b24a-8c92829af1fe"], ["LIMIT", 11]]
JobEntry Load (0.2ms) SELECT "job_entries".* FROM "job_entries" WHERE
"job_entries"."job_id" = ? [["job_id", 12]]
ActiveStorage::Attachment Load (1.0ms) SELECT "active_storage_attachments".* FROM
"active_storage_attachments" WHERE "active_storage_attachments"."record_type" = ? AND
"active_storage_attachments"."name" = ? AND "active_storage_attachments"."record_id" IN (?,
?) [["record_type", "JobEntry"], ["name", "images"], ["record_id", 8], ["record_id", 9]]
=> #<ActiveRecord::Relation [#<Job id: 12, customer_id: 3, description: nil,
shoot_start_date: "2020-11-25 00:00:00", shoot_end_date: "2020-11-26 00:00:00",
submission_deadline: "2020-11-27 00:00:00", delivery_deadline: "2020-11-28 00:00:00",
created_at: "2020-11-25 21:44:22", updated_at: "2020-12-14 19:30:06", token: "fd2356c1-996b-
4f95-b24a-8c92829af1fe", name: "teesting">]>
但是突然之间,子引用不再起作用。
>> j.job_entries
Traceback (most recent call last):
1: from (irb):4
Job Load (0.2ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."token" = ? LIMIT ? [["token",
"fd2356c1-996b-4f95-b24a-8c92829af1fe"], ["LIMIT", 11]]
JobEntry Load (0.1ms) SELECT "job_entries".* FROM "job_entries" WHERE
"job_entries"."job_id" = ? [["job_id", 12]]
ActiveStorage::Attachment Load (0.2ms) SELECT "active_storage_attachments".* FROM
"active_storage_attachments" WHERE "active_storage_attachments"."record_type" = ? AND
"active_storage_attachments"."name" = ? AND "active_storage_attachments"."record_id" IN (?,
?) [["record_type", "JobEntry"], ["name", "images"], ["record_id", 8], ["record_id", 9]]
NoMethodError (undefined method `job_entries' for #.
<Job::ActiveRecord_Relation:0x00005562db1258c0>)
Did you mean? entries
什么?请帮助我理解为什么会这样!
解决方案
NoMethodError (undefined method `job_entries' for #. <Job::ActiveRecord_Relation:0x00005562db1258c0>)
请注意,错误消息不是针对,Job
而是针对Job::ActiveRecord_Relation
.
#last
返回一个 Job。#where
返回一组存储在 ActiveRecord::Relation 中的作业。Job::ActiveRecord_Relation 是特定于 Job 的关系。
您还可以在返回值中看到这一点...
>> j = Job.getJobAndSubmissions('fd2356c1-996b-4f95-b24a-8c92829af1fe')
...
=> #<ActiveRecord::Relation [#<Job id: 12, ...]>
推荐阅读
- google-apps-script - 用于多列下拉菜单的 Google onEdit 脚本
- flutter - 如何在我们的应用程序中维护 API 数据
- linux - 在没有包装脚本的情况下将 stderr 和 stdout 写入文件
- azure-devops - Azure Devops OpenShift 并行发布
- c++ - 使用 registerConstructor 注入 Mock
- javascript - 递归方法继续前进,但方向相反。为什么?
- docker - Nginx 反向代理无法与容器通信
- c++ - 如何找到当前用户名和系统盘?
- flutter - ElevatedButton 不接受 SizedBox 的限制
- java - 将文档保存到数据存储中的特定集合