2013-03-06 2 views
0

기구 클래스는 다음과 같이 보입니다 가입 추가 :관련 테이블

some field named : price 
scope :top_expensive_classes, joins(:students).order('price DESC') 
belongs_to Student 
내가 ORGANIZATION_ID에 대한 클래스하지만이 클라스에없는 곳에서 검색하고 있기 때문에 그게 문제, 그래서 그것이 클라스로 시작하는 것이
@results = Klass.top_expensive_classes.where(organization_id: params[:id]).limit(RESULT_SET_COUNT) 

공지 사항, 그것은 학생에

:210

그리고 내 쿼리는 다음과 같습니다 그래서 어떤 식 으로든이 문제를 해결하기 위해 어딘가에 조인을 도입해야하지만 알아 내지 못했습니다.

답변

1

실제 문제는 귀하의 연관성이 잘못된 것 같습니다.

  • 학생은 많은 클래스
  • 클래스는이 많은 학생

하지만 당신이하는 학생이 클래스는 하나에 속하는

  • 많은 클래스가

    • 입니다있다 학생

    이것은 실제로는 이해가 가지 않습니다 (최소한 내가 수업과 학생이 상호 작용하는 것을 본 어떤 상황에서도). KlassStudent 사이의 일대 다 관계 대신 다 대다 관계를 만들어야합니다. 이 자리에서이 올바른 연결을 일단

    class Student < ActiveRecord::Base 
        has_many :klasses, through: :student_klasses 
        has_many :student_klasses 
    end 
    
    class Klass < ActiveRecord::Base 
        has_many :students, through: :student_klasses 
        has_many :student_klasses 
    end 
    
    class StudentKlass < ActiveRecord::Base 
        belongs_to :student 
        belongs_to :klass 
    end 
    

    , 당신은 Klass 클래스에서 :students 협회에 .joins를 호출해야합니다. 범위없이 할 수 있습니다.

    Klass.joins(:students).where("students.organization_id = ?", params[:id]).order('price DESC').limit(RESULT_SET_COUNT) 
    

    ActiveRecord Querying에서 the guide을 읽으십시오.


    은 여기 (위의 정확한 모델 정의를 사용) 증거 협회의 순서가 하지 문제를한다는 것을입니다.

    irb(main):001:0> s = Student.create(name: "Deefour") 
        SQL (3.6ms) INSERT INTO "students" ("created_at", "name", "updated_at") VALUES (?, ?, ?) [["created_at", Fri, 08 Mar 2013 01:33:32 UTC +00:00], ["name", "Deefour"], ["updated_at", Fri, 08 Mar 2013 01:33:32 UTC +00:00]] 
    => #<Student id: 1, name: "Deefour", created_at: "2013-03-08 01:33:32", updated_at: "2013-03-08 01:33:32"> 
    irb(main):002:0> kk = [] 
    => [] 
    
    irb(main):003:0> kk << Klass.create(title: "Klass 1") 
        SQL (0.3ms) INSERT INTO "klasses" ("created_at", "title", "updated_at") VALUES (?, ?, ?) [["created_at", Fri, 08 Mar 2013 01:34:06 UTC +00:00], ["title", "Klass 1"], ["updated_at", Fri, 08 Mar 2013 01:34:06 UTC +00:00]] 
    => [#<Klass id: 1, title: "Klass 1", created_at: "2013-03-08 01:34:06", updated_at: "2013-03-08 01:34:06">] 
    
    irb(main):004:0> kk << Klass.create(title: "Klass 2") 
        SQL (0.3ms) INSERT INTO "klasses" ("created_at", "title", "updated_at") VALUES (?, ?, ?) [["created_at", Fri, 08 Mar 2013 01:34:14 UTC +00:00], ["title", "Klass 2"], ["updated_at", Fri, 08 Mar 2013 01:34:14 UTC +00:00]] 
    => [#<Klass id: 1, title: "Klass 1", created_at: "2013-03-08 01:34:06", updated_at: "2013-03-08 01:34:06">, #<Klass id: 2, title: "Klass 2", created_at: "2013-03-08 01:34:14", updated_at: "2013-03-08 01:34:14">] 
    
    irb(main):005:0> s.klasses = kk 
        Klass Load (0.1ms) SELECT "klasses".* FROM "klasses" INNER JOIN "student_klasses" ON "klasses"."id" = "student_klasses"."klass_id" WHERE "student_klasses"."student_id" = ? [["student_id", 1]] 
        SQL (0.4ms) INSERT INTO "student_klasses" ("created_at", "klass_id", "student_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Fri, 08 Mar 2013 01:34:29 UTC +00:00], ["klass_id", 1], ["student_id", 1], ["updated_at", Fri, 08 Mar 2013 01:34:29 UTC +00:00]] 
        SQL (0.1ms) INSERT INTO "student_klasses" ("created_at", "klass_id", "student_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Fri, 08 Mar 2013 01:34:29 UTC +00:00], ["klass_id", 2], ["student_id", 1], ["updated_at", Fri, 08 Mar 2013 01:34:29 UTC +00:00]] 
    => [#<Klass id: 1, title: "Klass 1", created_at: "2013-03-08 01:34:06", updated_at: "2013-03-08 01:34:06">, #<Klass id: 2, title: "Klass 2", created_at: "2013-03-08 01:34:14", updated_at: "2013-03-08 01:34:14">] 
    
    irb(main):006:0> Student.first.klasses.map(&:id) 
        Student Load (0.2ms) SELECT "students".* FROM "students" ORDER BY "students"."id" ASC LIMIT 1 
        Klass Load (0.1ms) SELECT "klasses".* FROM "klasses" INNER JOIN "student_klasses" ON "klasses"."id" = "student_klasses"."klass_id" WHERE "student_klasses"."student_id" = ? [["student_id", 1]] 
    => [1, 2] 
    
  • +0

    내가 계속 해당 범위에 가입해야합니까? 현재 그것은 학생 표를 찾을 수 없다고 말합니다. 어딘가에 구문 오류가 있습니까? 어쩌면 학생이 아닌 학생이되어야할까요? – Bohn

    +0

    그것은 "Association 'students'were not found"라는 연관이 있습니다. – Bohn

    +1

    당신의 협회가 정확하게 있어야하는 것은 아닌 것 같습니다. 나는 당신을 돕기 위해 내 대답을 업데이트했습니다. – deefour