【发布时间】:2015-06-22 00:20:27
【问题描述】:
我正在尝试创建一个已离开 cmets 的独特患者的列表。代码字很好,直到我上传到它在 postgresql 中不起作用的 heroku。
这是我创建列表的 Ruby .erb 代码:
<% @comments.group(:patient_id).each_with_index do |comment, index| %>
<div class="profile-post color-one">
<span class="profile-post-numb"><%= index+1 %></span>
<div class="profile-post-in">
<h3 class="heading-xs"><a><%= link_to "#{comment.patient.first_name} #{comment.patient.last_name}", comment_path(comment) %></a></h3>
<p>Lastest comment from <%= time_ago_in_words(comment.created_at) %> ago<i class="pull-right"><%= link_to "Edit", edit_comment_path(comment) %> <%= link_to "Delete", comment_path(comment), method: :delete, data: {confirm: 'Are you sure you want to delete'} %></i></p>
</div>
</div>
<% end %>
@cmets 在控制器中定义为:
def index
@comments = current_clinician.comments.order("created_at desc")
end
heroku 日志给我这个错误信息:
PG::GroupingError: ERROR: column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT "comments".* FROM "comments" WHERE comments"."clini... ^ SELECT "comments".* *FROM "comments" WHERE "comments"."clinician_id" = $1 GROUP BY patient_id ORDER BY created_at desc
我已经尝试过其他 SO 问题的解决方案,例如 20942477。其中说我应该将字段 cmets.id 添加到我的组子句中:
<% @comments.group(:patient_id, :"comments.id").each_with_index do |comment, index| %>
这消除了 heroku 上的错误,但违背了 group 命令的目的 - 它不再只显示独特的患者,而是列出所有患者。
我也尝试了1780893 的解决方案。其中说我应该更改 ORDER BY:
@comments = current_clinician.comments.order("substring(created_at,1.8) desc")
这在本地给出了这个错误:
SQLite3::SQLException:没有这样的函数:子字符串:SELECT "cmets".* FROM "cmets" WHERE "cmets"."clinician_id" = ?命令 BY substring(created_at,1.8) desc
我意识到这是一个常见问题,我对 SQL 缺乏经验,因此无法获取代码,因此它可以在我的开发和生产环境中运行。我在 SO 上阅读的答案不是使用 Ruby 来获取 SQL 并超过我的经验水平。
【问题讨论】:
-
错误告诉你你正在尝试做的事情不能以这种方式完成。在此查询中,每个不同的患者 ID 仅返回一行。此患者 ID 可能有多个评论行。假设有 10 个 cmets 具有相同的 patient_id - 如果我们选择一个我们没有分组的列(例如它的 id),那么这个值应该来自 10 个中的哪一行?这是模棱两可的,所以 SQL 不允许你这样做。您只能使用要分组的列或聚合分组行的函数的输出,例如 COUNT 或 SUM。
标签: ruby-on-rails ruby postgresql heroku group-by