按另一个表中的列排序活动记录查询

时间:2016-01-12 14:50:45

标签: ruby-on-rails activerecord

我正在尝试通过特定的表列来命令我的活动记录查询,但是使用标准的Query.order(:id)格式,rails认为该列位于不同的表中。

这是我的有效记录查询:

@course = Course.select('*').joins(:course_metadata, :courseContent).where(course_id: params[:id]).order(:content_order)

以下是我的模特:

    class Course < ActiveRecord::Base
        has_one :course_metadata
        has_many :xrefCourseContent, foreign_key: 'course_id'
        has_many :courseContent, through: :xrefCourseContent, foreign_key: 'course_guid'
    end


    class CourseMetadata < ActiveRecord::Base
        self.table_name = 'course_metadata'
        belongs_to :course
    end


    class CourseContent < ActiveRecord::Base
        self.table_name = 'courseContent'
        has_many :xrefCourseContent, foreign_key: 'content_id', primary_key: 'content_id'
        has_many :course, through: :xrefCourseContent, foreign_key: 'content_id', 
    end


    class XrefCourseContent < ActiveRecord::Base
        self.table_name = 'xrefCourseContent'
        belongs_to :course, primary_key: 'course_id', foreign_key: 'course_guid'
        belongs_to :courseContent, primary_key: 'content_id', foreign_key: 'content_guid'
    end

查询通过外部参照表将课程连接到课程内容。

SELECT * FROM [courses] 
INNER JOIN [course_metadata] ON [course_metadata].[course_id] = [courses].[course_id] 
INNER JOIN [xrefCourseContent] ON [xrefCourseContent].[course_id] = [courses].[course_id] 
INNER JOIN [courseContent] ON [courseContent].[content_id] = [xrefCourseContent].[content_id] 
WHERE [courses].[course_id] = @0 
ORDER BY [courses].[content_order]

这是在错误消息中显示的sql查询,正如您所看到的,它认为content_order列位于courses表中,而实际上它位于xrefCourseContent中} table。

我是rails的新手,我仍在尝试围绕整个Active Record系统进行思考,请原谅我,如果我的模型中的某些代码是多余的或不必要的,但请随意指出任何可能得到改善。

1 个答案:

答案 0 :(得分:1)

应该是

@course = Course.select('*').joins(:course_metadata, :courseContent)
 .where(course_id: params[:id])
 .order("xrefCourseContents.content_order")

您需要指定从中找到content_order列的表格。