0

私の組織クラスは次のようになります。

has_many Students

私の学生クラスは次のようになります。

has_many Klasses
belongs_to Organization

私のクラスクラスは次のようになります。

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 で始まることに注意してください。これが問題です。なぜなら、where クラスで organization_id を検索しているのですが、それは Klass ではなく、 Student クラスにあるため、これを修正するためにどこかに結合を導入する必要がありますが、できませんでしたそれを理解してください。

4

1 に答える 1

1

本当の問題は、あなたの関連付けが間違っている可能性が高いことだと思います。

  • 学生は多くのクラスを持っています
  • クラスには多くの生徒がいます

しかし、あなたが持っているのは

  • 学生は多くのクラスを持っています
  • クラスは 1 人の生徒に属します

これは本当に意味がありません (少なくとも、クラスと生徒が相互作用するのを見たことのある状況では)。と の間に 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を呼び出す必要があります。スコープなしで実行できます。:studentsKlass

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

ActiveRecord Queryingのガイドを読んでください。


関連付けの順序が重要ではないことの証明(上記の正確なモデル定義を使用)を次に示します。

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]
于 2013-03-06T20:26:31.850 に答える