创建“联接”查询2关联

时间:2017-10-05 22:44:25

标签: sql ruby-on-rails activerecord

我的情况是SELECT * FROM yourtable WHERE INSTR(col_a,col_b,1)>0 OR INSTR(col_b,col_a,1)>0 or INSTR(substr(col_a,2,length(col_a)), col_b,1)>0 or INSTR(substr(col_b,2,length(col_b)), col_a,1)>0 属于CourseSession,属于Course。在我的控制器中,我想从CourseSession中获取程序的名称。我一直在环顾四周,并且看到很多人建议使用Program方法。不幸的是,这对我来说不起作用。我收到这个错误:

joins

我做错了什么?

Can't join 'CourseSession' to association named 'program'; perhaps you misspelled it?
@sessions = if params[:program]
  CourseSession.joins(:course).joins(:program).where("program.name = params[:program]")
else
  CourseSession.all
end

2 个答案:

答案 0 :(得分:0)

有点不清楚你想做什么。您的代码建议您想要:

    如果CourseSessions存在,则{li> Programparams[:program]相关联,
  • 如果CourseSessions不存在,则全部为params[:program]

在这种情况下,我相信你会做类似的事情:

@sessions = if params[:program]
  CourseSession.where(course: Course.where(program: Program.find_by(name: params[:program])))
else
  CourseSession.all
end

答案 1 :(得分:0)

当您使用CourseSession.joins(:course).joins(:program)(即链接连接)时,您只是加入course_sessions表和courses表和programs表,因此出错。

您可以使用以下语法实现您所要求的内容:

CourseSession.joins(course: :program)

此处,coursesprograms表是内连接的,course_sessionscourses表是内连接的。

第二个问题在于您的where方法。表名是按惯例复数,因此您应该使用programs.name而不是program.name。请尝试以下方法:

CourseSession.joins(course: :program).where("programs.name = ?", params[:program])