如何在ruby on rails中使用Joins和left outer join?

tzdcorbm  于 2023-05-06  发布在  Ruby
关注(0)|答案(3)|浏览(230)

我有以下数据库模式结构:

School
has_many :students

Students
has_many :books

Books
(has an attribute pages(integer))

问题是我想要一个学生在学校水平上拥有的一本书的所有页面的总数。但也有一种可能性,学生可能没有任何书。
我想使用Ruby代码和joins和includes等方法选择以下Rails查询:

SELECT * FROM school INNER JOIN students ON students.school_id = schools.id LEFT OUTER JOIN books ON books.student_id = students.id

我尝试了以下方法:

School.joins({:students => :books}).all

但这并没有考虑到那些没有任何书籍的学生。如何解决这个问题?

jyztefdp

jyztefdp1#

不幸的是,您的Ruby on Rails旧版本不支持left_outer_joins。但是你仍然可以用字符串语法手动定义joins,像这样:

School
  .joins(:students) # defaults to INNER JOIN
  .joins('LEFT OUTER JOIN books ON books.student_id = students.id')
  .all

顺便说一句,你使用的是一个过时的、未经维护的Ruby on Rails版本。Rails 4.1.6在大约7年前就已经寿终正寝了,现在有几个well-known security vulnerabilities。我强烈建议您将应用程序升级到最新版本的Ruby on Rails。

wecizke3

wecizke32#

试试看

School.left_outer_joins(students: :books).all
6jjcrrmo

6jjcrrmo3#

可以按如下方式使用左连接

School.all.left_joins(students: :books)

  the out query is 

  SELECT "schools".* FROM "schools" 
  LEFT OUTER JOIN "student" ON "student"."school_id" = "schools"."id" 
  LEFT OUTER JOIN "books" ON "books"."student_id" = "student"."id"

相关问题