【问题标题】:PostgreSQL, Rails + Heroku, Column must appear in "group by"PostgreSQL、Rails + Heroku、Column 必须出现在“group by”中
【发布时间】:2012-12-14 10:35:08
【问题描述】:

我在 Heroku 上部署我的应用时遇到此错误:

Started GET "/collections/transect/search?utf8=%E2%9C%93&search%5Btagged_with%5D=village&commit=Search" for 98.201.59.6 at 2011-03-27 17:02:12 -0700

ActionView::Template::Error (PGError: ERROR:  column "photos.custom_title" must appear in the GROUP BY clause or be used in an aggregate function
: SELECT  "photos".* FROM "photos" INNER JOIN "taggings" ON "photos"."id" = "taggings"."photo_id" INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "tags"."name" IN ('village') AND ("photos".collection_id = 1) GROUP BY photos.id LIMIT 20 OFFSET 0):
     17: 
     18: - @bodyclass = 'dark'
     19: #search_view.photo_tiles
     20:   = render :partial => 'collections/photos/alt_tiles', :collection => @photos, :as => :photo
   app/views/collections/search.html.haml:20:in `_app_views_collections_search_html_haml__2343730670144375006_16241280__2249843891577483539'

我看到了这些类似的问题 (1,2)。

问题是,此视图中没有任何内容要求 custom_title 属性,我也没有执行带有“group_by”子句的查询。

这是似乎触发错误的部分:

- ((photo_counter+1) % 5 == 0) ? @class = 'last' : @class = ''
.photo{ :class => @class }
  .alt_tile
    = link_to( image_tag(photo.file.url(:tile)), collection_photo_path(@collection,photo), :class => 'img_container' )
    .location= photo.location(:min)
    .tags= photo.tag_array.join(' | ')

这是引发错误的 collections#search 操作:

def search
  @curator_toolbar = true
  @collection = Collection.find(params[:id])
  @search = @collection.photos.search(params[:search])
  @photos = @search.page(params[:page]).per(20)
end

所以看起来这可能是一个插件问题?我将 MetaSearch 用于搜索功能,将 Kaminari 用于分页。是否有人对具体导致此问题的原因以及如何解决此问题有任何想法或建议?

--编辑--

好的,我似乎找到了真正的问题:

使用 MetaSearch 和我的关键字标签模型,我创建了一个如下所示的搜索方法:

def self.tagged_with( string )
  array = string.split(',').map{ |s| s.lstrip }
  joins(:tags).where('tags.name' => array ).group('photos.id')
end

现在,在创建这个方法时,我得到了很多帮助——正如我之前提到的,我是一个彻头彻尾的 SQL 白痴。

此方法适用于 SQLite,但不适用于 PostgreSQL,因为每当搜索中包含关键字时,它都会触发“group_by”问题。

因此,this question 似乎表明我需要将属于我的照片模型的每一列都放在“组”参数中,否则 Postgre 会中断。

这让我感到恐惧有几个原因:

  1. 我的照片模型非常复杂,并且包含大量字段。
  2. 我的应用仍在开发中,照片模型的变化比其他任何应用都多。
  3. 如果他们忘记在标签搜索参数的 group 语句中添加列,我不希望以后每次有人触摸照片模型时我的代码都会被破坏。

那么,谁能帮我理解如何重写这个方法,这样它就不会破坏 PostgreSQL —— 理想情况下,我不必在解决方案中包含属于这个模型的所有字段的列表,或者至少不是手动维护的列表?

【问题讨论】:

  • "GROUP BY photos.id LIMIT 20 OFFSET 0" - 你从 MySQL 中解除了这个
  • 没有从任何地方提取任何 SQL,我是一个 SQL 白痴 - 因此这个问题。你知道 Kaminari 和/或 MetaSearch 吗?您是否知道其中哪一个会生成此查询?
  • 只有 MySQL 和 SQLite 支持您发布的语句中的功能。
  • 太好了,我相信你!现在,您对查询的来源有什么建议,以便我修复它吗?我没有在我的代码中编写任何查询,但我正在使用两个插件。我对 SQL 或 MetaSearch 或 Kaminari 如何工作的了解不够,不知道如何查找问题和/或解决问题。
  • 好吧,.search 方法仅适用于 activerecord 对象,因此将其链接到数组 (photo_ids) 不起作用。

标签: ruby-on-rails postgresql group-by


【解决方案1】:

所以,事实证明我可以通过在我的tagged_with 方法中将“group”替换为“select”来解决这个问题。

def self.tagged_with( string )
  array = string.split(',').map{ |s| s.lstrip }
  select('distinct photos.*').joins(:tags).where('tags.name' => array )
end

问题解决了! 请参阅这篇文章,了解为什么这是一个更好的主意。(抱歉,网站后来被删除,我不记得它说了什么。)另外,感谢@987654321 @他对解决我问题的衍生问题的回答。

【讨论】:

  • 链接已失效。这是我们不喜欢外部链接的原因之一。如果您还记得为什么它说这个想法很棒,请编辑和总结。
  • @RichardTheKiwi 链接已删除,抱歉我不记得它说了什么。
猜你喜欢
  • 2020-02-08
  • 2016-05-26
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多