Active Record .includes和where where where where where where where where where子句?

时间:2014-10-01 02:58:59

标签: ruby-on-rails activerecord

希望有人能解释一下。

我有

class Student < ActiveRecord::Base
has_many :course_bookings, autosave: true, dependent: :destroy

class CourseBooking < ActiveRecord::Base
  belongs_to :course_plan

class CoursePlan < ActiveRecord::Base
  has_many :course_bookings, :dependent => :destroy

我正在尝试的查询是

对于一个给定的学生,找到他所有的course_plan代码等于&#34; ENG&#34;

另外,我想加载course_booking.course_plan e.g。

  s = Student.first

  s.course_bookings.includes(:course_plan).where(course_plans:{code:'ENG'}).references(:course_plans).size

结果为1

其中

  s.course_bookings.includes(:course_plan).where(course_plan:{code:'ENG'}).references(:course_plans).size

即。删除了.where(course_plan:{code:'ENG'})

中的 s

结果

PG :: UndefinedTable:错误:缺少表格#34; course_plan&#34;

的FROM子句条目

我不明白为什么我需要在where子句中使用 s

我知道生成的sql是

LEFT OUTER JOIN "course_plans" ON "course_plans"."id" = "course_bookings"."course_plan_id" WHERE "course_bookings"."student_id" = $1 AND "course_plans"."code" = 'ENG'"

VS

LEFT OUTER JOIN "course_plans" ON "course_plans"."id" = "course_bookings"."course_plan_id" WHERE "course_bookings"."student_id" = $1 AND "course_plan"."code" = 'ENG'"

即。差异为"course_plan"."code" = 'ENG'" VS "course_plans"."code" = 'ENG'"

我会认为Active Record足够智能,以实现我的belongs_to配置称为course_plan?

想知道我做错了吗?还是有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

where()范围内的代码更接近sql而不是activerecord。你也可以直接把它写成sql:

where("course_plans.code = 'ENG'")  

course_plans:将hash范围中的哈希值作为表的名称,而不是belongs_to关联的名称;因此PG错误 - 没有名为&#39; course_plan&#39;。

的表格