不明确的列名和ActiveRecord查询语法

时间:2014-05-08 11:54:45

标签: sql ruby-on-rails activerecord

以下是两个连接表中不明确列的查询:

SELECT
  o.time as order_time,
  c.time as client_time
FROM
  orders o
  INNER JOIN clients c ON c.id = o.client_id

在ActiveRecord查询语言中执行相同操作时,所有来源都建议如下:

Order.select('orders.time as order_time, c.time as client_time').joins(:client)

我不喜欢这里的部分:

.select('orders.time as order_time, c.time as client_time')

我更喜欢使用ActiveRecord语法,如下所示:

.select(order: { time: 'order_time' }, client: { time: 'client_time'})

Rails中是否存在类似内容?

1 个答案:

答案 0 :(得分:2)

不幸的是,没有干净的ActiveRecord方法来做我想知道的事情。但你可以随时尝试ARel:

Order.joins(:client).select([
  Order.arel_table[:time].as('order_time'),
  Client.arel_table[:time].as('client_time')
])

这会生成您发布的SQL(没有表的较短名称),并适用于rails 3+< 4.在轨道4中,您可以从select方法中删除方括号。请注意,这是ActiveRecord与ARel结合使用,而不仅仅是ARel。

ARel的完整代码如下所示:

o = Order.arel_table # or Arel::Table.new('orders')
c = Client.arel_table

o.project(o[:time].as('order_time'), c[:time].as('client_time')).join(c).on(c[:id].eq(o[:client_id]))
# => SELECT "orders"."time" AS order_time, "clients"."time" AS client_time FROM "orders" INNER JOIN "clients" ON "clients"."id" = "orders"."client_id"