将此SQL查询转换为AREL(外连接)

时间:2013-02-07 04:50:35

标签: sql ruby ruby-on-rails-3 activerecord arel

我正在尝试将此查询转换为AREL:

SELECT users.* FROM users LEFT OUTER JOIN (
      SELECT DISTINCT educations.user_id
      FROM educations
      INNER JOIN schools
      ON educations.school_id = schools.id
      WHERE schools.name = "school_name" ) AS x 
ON users.id = x.user_id WHERE x.user_id IS null

我希望能够像这样链接这个查询:

class User < ActiveRecord::Base
  def find_by_school(school_name)
    ...
  end
end

myUser.find_by_school("school_name").where(...).joins(...)...etc

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

虽然这个问题有点陈旧,但我偶然发现了......

如果我正确理解您的查询,您希望获得某个学校的所有用户,这些用户没有受过教育......

如果是这样,我会采取以下方式 - 鉴于您的关系都已正确设置:

class User < ActiveRecord::Base
  def self.find_educated_by_school_name(school_name)
    Education.pluck(:user_id).joins(:schools).where('schools.name = ?', school_name)
  end
end

User.where('users.id NOT IN (?)', User.find_educated_by_school_name('school_name'))

另请注意,按惯例myUser.find_by_*表示“在给定的用户实例上找到某些内容”。因此,它应该使用用户实例来查找内容。

User.find_by_*表示“按一定标准查找用户”。

希望我的意思很清楚!