我在 PGAdmin 中写了这个 sql 语句,它按预期提取数据。
SELECT Sum(timerecords.manual_input_hours) AS hours,
To_date(timerecords.time_start, 'YYYY-MM-DD') AS date,
tasks.title,
timerecords.client_id
FROM timerecords
INNER JOIN tasks
ON tasks.id = timerecords.task_id
WHERE timerecords.client_id = '15'
GROUP BY To_date(timerecords.time_start, 'YYYY-MM-DD'),
timerecords.task_id,
timerecords.client_id,
tasks.title
ORDER BY date DESC
然后我在 scuttle.io 中运行 sql 语句转换为 Arel
Timerecord.select(
[
Arel::Nodes::NamedFunction.new(
'SUM', [Timerecord.arel_table[:manual_input_hours]]
).as('hours'), Arel::Nodes::NamedFunction.new(
'TO_DATE', [Timerecord.arel_table[:time_start], 'YYYY-MM-DD']
).as('date'), Task.arel_table[:title], Timerecord.arel_table[:client_id]
]
).where(Timerecord.arel_table[:client_id].eq('15')).joins(
Timerecord.arel_table.join(Task.arel_table).on(
Task.arel_table[:id].eq(Timerecord.arel_table[:task_id])
).join_sources
).order(:date).reverse_order.group(
Arel::Nodes::NamedFunction.new(
'TO_DATE', [Timerecord.arel_table[:time_start], 'YYYY-MM-DD']
), Timerecord.arel_table[:task_id], Timerecord.arel_table[:client_id], Task.arel_table[:title]
)
当我调用@tasks.each.do(在该行)时,我收到此错误消息,但没有其他信息。
Arel::Visitors::UnsupportedVisitError in Agency::Clientmanagement#show
Unsupported argument type: String. Construct an Arel node instead.
我从研究中尝试过的一些项目......而不是to_date,我尝试了to_char。我还将我的开发数据库从 sqllite3 更改为 postgresql 以匹配生产服务器。
生成的代码非常复杂,因为它使用 Arel 来处理通过 ActiveRecord 查询接口很容易做到的事情:
date_fn = Arel::Nodes::NamedFunction.new(
'TO_DATE', [Timerecord.arel_table[:time_start], Arel::Nodes.build_quoted('YYYY-MM-DD')]
)
Timerecord.select(
tbl[:manual_input_hours].sum.as('hours'), # you don't need to define the function
date_fn.as('date'),
:title,
:client_id
)
.where(client_id: '15')
.joins(:tasks)
.order(date: :desc)
.group(
:date, :task_id, :client_id, Task.arel_table[:title]
)
某些数据库(如 Oracle)不允许您在 GROUP BY 子句中使用选定的列。在这种情况下,您需要重复函数调用:
.group(
date_fn, :task_id, :client_id, Task.arel_table[:title]
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句