以下是两个连接表中不明确列的查询:
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中是否存在类似内容?
答案 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"