Dan*_*rez 8 sql activerecord ruby-on-rails
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
我设法使用
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
Run Code Online (Sandbox Code Playgroud)
但我觉得我遗漏了一些东西,只需AND使用ActiveRecord查询方法添加左连接的条件.我也尝试过这样的事情
User.includes(:possible_dates)
.where('possible_dates.event_id' => self.id)
.uniq
Run Code Online (Sandbox Code Playgroud)
但是这会产生(如预期的那样),一个WHERE在末尾有一个子句的查询,而不是AND我想要在连接上的子句.
顺便说一句,self上面的两个片段是我Event班级的一个实例.
谢谢您的帮助.
(一年后...)环顾四周后,我发现最好的可能是使用 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
Run Code Online (Sandbox Code Playgroud)
in应替换为正确的事件 ID 1。eq(1)
| 归档时间: |
|
| 查看次数: |
1989 次 |
| 最近记录: |