2014-10-01 25 views
0

希望有人能解释这一点。Active Record .includes和where where where子句中的查询需要表名?

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_bookings,他们的course_plan码等于“ENG”

而且我想急切地加载course_booking.course_plan eg

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'})

PG :: UndefinedTable

结果S:错误:缺少表“course_plan”的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'"

我还以为活动记录足够的智慧去实现我belongs_to的assoication被称为course_plan?

想知道我做这一切都错了吗?或任何人都可以解释?

回答

0

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

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

的course_plans:关键就在哈希在那里范围作为表的名称,belongs_to的关联不是名称;因此PG错误 - 没有名为'course_plan'的表。