我有一个使用案例,其中我从某个模型获取符号化的深度关联,并且必须执行涉及使用外连接的某些查询。如何在不手动编写完整SQL的情况下完成这项任务?
我不想要的答案: - 使用includes(不能很好地解决深度关联问题(.includes(:cars => [:windows, :engine => [:ignition].....表现出意外行为),而且我不想要它的副作用) - 自己编写SQL(抱歉,现在是2013年,需要跨数据库支持等等,而且我获取的对象是只读的,会产生更多的副作用)
我想要一个Arel解决方案。我知道可以使用arel_table从模型中构造SQL表达式,还有一个DSL用于连接,但是我无法在模型的连接方法中使用它。
我不想要的答案: - 使用includes(不能很好地解决深度关联问题(.includes(:cars => [:windows, :engine => [:ignition].....表现出意外行为),而且我不想要它的副作用) - 自己编写SQL(抱歉,现在是2013年,需要跨数据库支持等等,而且我获取的对象是只读的,会产生更多的副作用)
我想要一个Arel解决方案。我知道可以使用arel_table从模型中构造SQL表达式,还有一个DSL用于连接,但是我无法在模型的连接方法中使用它。
car = Car.arel_table
engine = Engine.arel_table
eng_exp = car.join(engine).on(car[:engine_id].eq(engine[:id]))
eng_exp.to_sql #=> GOOD! very nice!
Car.joins(eng_exp) #=> Breaks!!
我不知道为什么这个方法不起作用。我也不确定到底缺少什么。但现在它是离解决问题最近的方法了。如果有人能够帮助我完善我的示例,或者提供一个好的解决方案,或者告诉我Rails何时将包含如此明显必要的功能,我将永远感激。