9

我正在使用带有 ActiveRecord 的 Rails 3,如果不插入几乎纯 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

但我觉得我缺少一些东西来简单地AND使用 ActiveRecord 查询方法添加左连接的条件。我也尝试做这样的事情

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

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

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

谢谢您的帮助。

4

1 回答 1

4

(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

1ineq(1)应替换为正确的事件 ID 。

于 2014-09-05T16:27:23.893 回答