2013-03-06 2 views
0

Моей Организации класса выглядит примерно так:Добавление РЕГИСТРИРУЙТЕСЬ для связанных таблиц

has_many Students 

Моего Студент класс выглядит следующим образом:

has_many Klasses 
belongs_to Organization 

Моего Klass класса выглядит следующим образом:

some field named : price 
scope :top_expensive_classes, joins(:students).order('price DESC') 
belongs_to Student 

И мой запрос выглядит следующим образом:

@results = Klass.top_expensive_classes.where(organization_id: params[:id]).limit(RESULT_SET_COUNT) 

Обратите внимание, что она начинается с Klass, так что это проблема, потому что я ищу в котором класс для organization_id, но это не в Классе, он находится в Студента класс, поэтому каким-то образом я должен ввести соединение, чтобы исправить это, но не мог понять.

ответ

1

Я думаю, что реальная проблема заключается в том, что ваши ассоциации, скорее всего, неверны.

  • Студент имеет много классов
  • класс имеет много студентов

но то, что у вас есть

  • Студент имеет много классов
  • класс принадлежит к одному студент

Это не имеет никакого смысла (по крайней мере, в любой ситуации, когда-либо видел, как класс и ученик взаимодействуют). Вы должны создавать отношения «многие ко многим» вместо отношения «один ко многим» между Klass и Student.

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 

После того, как у вас есть эти правильные ассоциации в месте, вам нужно позвонить .joins на :students ассоциации с Klass класса. Вы можете обойтись без области действия.

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

Читать the guide на ActiveRecord запрашивая.


Вот доказательство (используя определения точной модели выше), что упорядочение ассоциаций делает не вопроса.

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

говорится: «Ассоциация, названная« ученики », не найдена» – Bohn

+1

Похоже, что ваши ассоциации не совсем то, чем они должны быть. Я обновил свой ответ, чтобы помочь вам. – deefour