2014-10-01 75 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'的表。