Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不明确的列名和ActiveRecord查询语法_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

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"