sql – ActiveRecord左外连接和子句

前端之家收集整理的这篇文章主要介绍了sql – ActiveRecord左外连接和子句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Rails 3和ActiveRecord,我不能让它生成我想要的查询而不插入几乎普通的sql.

我只是想执行这个SQL查询(实际上查询有点复杂,但实际上这部分我无法正确).

SELECT DISTINCT users.*,possible_dates.*
FROM users 
LEFT OUTER JOIN possible_dates 
ON possible_dates.user_id = users.id 
AND possible_dates.event_id = MY_EVENT_ID;

我设法使用

User.includes(:possible_dates)
    .joins("LEFT OUTER JOIN possible_dates
            ON possible_dates.user_id = users.id
            AND possible_dates.event_id = #{ActiveRecord::Base.sanitize(self.id)}"
    )
    .uniq

但我觉得我遗漏了一些东西,只需使用ActiveRecord查询方法添加左连接的AND条件.
我也尝试过这样的事情

User.includes(:possible_dates)
    .where('possible_dates.event_id' => self.id)
    .uniq

但是这会产生(如预期的那样)一个在末尾带有WHERE子句的查询,而不是我想要的AND子句.

顺便说一下,上面两个片段中的self是我的Event类的一个实例.

谢谢您的帮助.

解决方法

(1年后……)
环顾四周后,我发现最好的可能是使用arel表.
对于上面的示例,以下代码将起作用.
ut = User.arel_table
pt = PossibleDate.arel_table
et = Event.arel_table

User.joins(
  ut.join(pt,Arel::Nodes::OuterJoin)
   .on(pt[:user_id].eq(u[:id])
      .and(pt[:event_id].eq(1))
   ).join_sql
).includes(:possible_dates).uniq

方程(1)中的1应该用正确的事件id替换.

猜你在找的MsSQL相关文章