2017-10-05 16 views
-1

私は、がCourseに属し、Programに属する状況があります。私のコントローラーでは、CourseSessionからプログラムの名前を取得したいと思います。私は周りを見ていて、多くの人々がjoinsメソッドを使用して示唆しているのを見てきました。残念ながら私の場合、これは私の場合はうまくいかなかった。このエラーが発生します:"結合"クエリの作成2関連付け

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 

class Program < ApplicationRecord 
    has_many :courses, dependent: :nullify 
end 

class Course < ApplicationRecord 
    has_many :sessions, class_name: "CourseSession", inverse_of: :course, dependent: :destroy 

    belongs_to :program 
end 

class CourseSession < ApplicationRecord 
    belongs_to :course 
end 

答えて

0

あなたがCourseSession.joins(:course).joins(:program)を使用する(つまり、チェーンが参加する)、あなただけの、したがってcoursesテーブルとprogramsテーブルでcourse_sessionsテーブルに参加していますエラー。

何を求めてきましたが、次の構文を使用して達成することができます。

ここ
CourseSession.joins(course: :program) 

coursesprogramsテーブルは、内側参加し、course_sessionscourses表されている内部結合されています。

2番目の問題は、whereメソッドにあります。テーブル名は慣例によって複数のため、の代わりにprograms.nameを使用する必要があります。代わりに次の方法をお試しください。

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

ありがとうございます。私は質問する必要があるので、まだ少し質問しています。アソシエーション・チェーンを辿って何かを書いているときに、パフォーマンスヒットはありますか?もしそうなら、どんな提案もありますか? –

+0

'courses.program_id'と' course_sessions.course_id'にインデックスがある限り、あなたは良いはずです。これは私が想像するレポートではないので、あなたは安全だと思います。 – vee

+0

お役立ち情報ありがとう。 「レポート」とはどういう意味ですか? –

0

それはあなたがやろうとなけなし不明です。あなたのコードは、あなたが欲しい示唆:

params[:program]場合 Programに関連付けられている
  • CourseSessionsparams[:program]が存在しない場合に存在し、
  • すべてCourseSessions。私はあなたのような何かをしたいと考えていた場合には

@sessions = if params[:program] 
    CourseSession.where(course: Course.where(program: Program.find_by(name: params[:program]))) 
else 
    CourseSession.all 
end 
関連する問題