Ruby on Rails - PG错误

时间:2014-07-21 18:36:53

标签: ruby-on-rails postgresql

On Rails 4,通过Heroku托管。我已经阅读了一些关于这个问题的线索,但需要自己澄清一下。相关模型:

提交:

  belongs_to :category
  belongs_to :user
  belongs_to :organization
  belongs_to :division

在提交的索引页面中,我列出了用户提交的所有提交内容,按:contest_year属性进行分组,以及提交所属的:organization_id属性。

提交控制器:

def index
  @paginate = current_user.submissions.group([:organization_id, 
  :contest_year]).includes(:organization).page(params[:page]).per(3).order('contest_year DESC')
end

(此索引页面具有Kaminari的分页功能)

索引视图:

<% @paginate.each do |contest| %>
  <div class="submissionheading"><h2><%= contest.contest_year %>: <%= contest.organization.name %></h2></div>
  <% current_user.submissions.includes(:submission_details, :user, category: :award).order('created_at DESC').where(organization_id: contest.organization_id, contest_year: contest.contest_year).in_groups_of(3, false) do |group| %>
    <div class="row">
    <% group.each do |submission| %>
      <div class="col-md-4">
        <p class="bold"><%= submission.category.award.name %> <%= submission.category.code %>: <%= submission.category.name %></p>
        <p>Submitted By: <%= submission.user.first_name %> <%= submission.user.last_name %></p>
      </div>
    <% end %>
  </div><br/>
  <% end %>
<% end %>

<p><%= paginate @paginate %></p>

我收到此错误:

PG::Error: ERROR:  column "submissions.id" must appear in the GROUP BY clause or be used in an aggregate function

如果我将:id属性插入上述控制器代码的组部分,它会重复每次提交的提交信息。这是一个例子:

它应该正常做什么(在组部分中没有:id):

enter image description here

在组部分中插入:id后它的作用:

enter image description here

它会针对每个提交进行迭代,而不是仅针对具有相同组织/年份的三个提交进行迭代。基本上,我不想将:id添加到分组中,但PG正在抛出此错误!如何重新编写控制器代码,以便PG在保持分组正确的同时接受它?谢谢!

1 个答案:

答案 0 :(得分:1)

select('DISTINCT(submissions.id), submissions.*')添加到模型查找器或将链uniq添加到其上:

def index
  @paginate = current_user.submissions.uniq.group([:id, :organization_id, 
  :contest_year]).includes(:organization).page(params[:page]).per(3).order('contest_year DESC')
end

<强>更新

问题出在您的视图代码中。您正在迭代@paginate集合,然后在其中再次调用current_user.submissions。不知道你在这里做了什么,但它可能通过in_groups_of(3)调用来解决所有问题。检查您的@paginate集合是否确实是唯一的,然后调试您的观看代码。