Sql 不明确的列名和ActiveRecord查询语法
以下是对两个联接表中不明确列的查询:Sql 不明确的列名和ActiveRecord查询语法,sql,ruby-on-rails,activerecord,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(:clien
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(order: { time: 'order_time' }, client: { time: 'client_time'})
我不喜欢这里的部分:
.select('orders.time as order_time, c.time as client_time')
我更喜欢使用ActiveRecord语法,如下所示:
Order.select('orders.time as order_time, c.time as client_time').joins(:client)
.select(order: { time: 'order_time' }, client: { time: 'client_time'})
Rails中存在类似的东西吗?不幸的是,我知道没有干净的ActiveRecord方法来实现您想要的功能。但你可以试试阿雷尔:
Order.joins(:client).select([
Order.arel_table[:time].as('order_time'),
Client.arel_table[:time].as('client_time')
])
这将生成您发布的SQL(表的短名称为sans),并适用于rails 3+<4。在rails 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"