首页 > 解决方案 > 奇怪的 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

什么?请帮助我理解为什么会这样!

标签: ruby-on-railsrails-activerecord

解决方案


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, ...]>

推荐阅读