ruby-on-rails - 如何在 Ruby on Rails 中使用 include 或 join 获取其他表的结果

标签 ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我想查询private_classes的结果。场景是:

class PrivateClass < ActiveRecord::Base
  belongs_to :private_school
  has_many :lesson_plans
end

class JoinedPrivateSchool < ActiveRecord::Base
  belongs_to :student
  belongs_to :private_school
end

class PrivateSchool < ActiveRecord::Base
  belongs_to :teacher
  has_many :private_classes
  has_many :joined_private_schools
end

class Student < ActiveRecord::Base
  has_many :joined_private_schools
end

JoinPrivateSchool 具有属性 private_school_id

我在做:

s = Student.find(9)

s.joined_private_schools

结果是:

=> #<ActiveRecord::Associations::CollectionProxy [#<JoinedPrivateSchool id: 8,
 user_id: 73, student_id: 9, private_school_id: 28, created_at: "2017-02-16 
12:38:37", updated_at: "2017-02-16 12:38:37">, #<JoinedPrivateSchool id: 9,
 user_id: 73, student_id: 9, private_school_id: 33, created_at: "2017-02-16 
12:42:01", updated_at: "2017-02-16 12:42:01">, #<JoinedPrivateSchool id: 12, 
user_id: 73, student_id: 9, private_school_id: 32, created_at: "2017-02-16 
13:19:02", updated_at: "2017-02-16 13:19:02">]>

如果我这样做:

c = s.joined_private_schools.includes(private_school: :private_classes)

结果是:

JoinedPrivateSchool Load (0.6ms)  SELECT "joined_private_schools".* FROM 
"joined_private_schools" WHERE "joined_private_schools"."student_id" = $1 
 [["student_id", 9]]


PrivateSchool Load (0.9ms)  SELECT "private_schools".* FROM "private_schools" 
WHERE "private_schools"."id" IN (28, 33, 32)  ORDER BY 
"private_schools"."created_at" DESC


PrivateClass Load (0.7ms)  SELECT "private_classes".* FROM "private_classes" 
WHERE "private_classes"."private_school_id" IN (33, 32, 28)  ORDER BY 
"private_classes"."created_at" DESC


=> #<ActiveRecord::AssociationRelation [#<JoinedPrivateSchool id: 8, user_id: 
73, student_id: 9, private_school_id: 28, created_at: "2017-02-16 12:38:37",
 updated_at: "2017-02-16 12:38:37">, #<JoinedPrivateSchool id: 9, user_id: 73,
 student_id: 9, private_school_id: 33, created_at: "2017-02-16 12:42:01", 
updated_at: "2017-02-16 12:42:01">, #<JoinedPrivateSchool id: 12, user_id: 73,
 student_id: 9, private_school_id: 32, created_at: "2017-02-16 13:19:02", 
updated_at: "2017-02-16 13:19:02">]> 

但这仍然是错误的结果。

我需要使用一个查询来获取 private_classes 的结果,这样我就可以避免多个 each 循环。

最佳答案

如果你想拥有 PrivateClass,你就从错误的点开始(User)。您需要从 PrivateClass 开始加入所有中间表并使用用户 id 作为条件:

PrivateClass.joins(private_school: :user).where(user: {id: 9})

# or a little more performant (avoids one join)

PrivateClass.joins(:private_school).where(private_school: {user_id: 9})

关于ruby-on-rails - 如何在 Ruby on Rails 中使用 include 或 join 获取其他表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42650704/

相关文章:

ruby-on-rails - 是否有一些 Ruby on Rails 方法可以将模型对象转换为 HASH 结构?

ruby-on-rails - 测试 Rails 4 Controller

ruby 年哈希生成

ruby-on-rails - 共享具有多个属性的枚举声明值

html - 设计多个超大屏幕 - Bootstrap

javascript - 如何使用 Ruby on Rails 和 Bootstrap 3 初始化 Bootstrap Tagsinput

ruby-on-rails - 通过 "rake spec"调用时 RSpec 规范失败,通过 "spec spec"调用时通过

css - 在 css ruby​​ on rails 4 错误中使用图像

ruby-on-rails - Rails,用脏了还是改了?带有 after_commit 的标志

mysql - 按整数值分类和 COUNT() 的 sql 优化