【发布时间】: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'
问题是,此视图中没有任何内容要求 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 会中断。
这让我感到恐惧有几个原因:
- 我的照片模型非常复杂,并且包含大量字段。
- 我的应用仍在开发中,照片模型的变化比其他任何应用都多。
- 如果他们忘记在标签搜索参数的 group 语句中添加列,我不希望以后每次有人触摸照片模型时我的代码都会被破坏。
那么,谁能帮我理解如何重写这个方法,这样它就不会破坏 PostgreSQL —— 理想情况下,我不必在解决方案中包含属于这个模型的所有字段的列表,或者至少不是手动维护的列表?
【问题讨论】:
-
"
GROUP BY photos.idLIMIT 20 OFFSET 0" - 你从 MySQL 中解除了这个 -
我 没有从任何地方提取任何 SQL,我是一个 SQL 白痴 - 因此这个问题。你知道 Kaminari 和/或 MetaSearch 吗?您是否知道其中哪一个会生成此查询?
-
只有 MySQL 和 SQLite 支持您发布的语句中的功能。
-
太好了,我相信你!现在,您对查询的来源有什么建议,以便我修复它吗?我没有在我的代码中编写任何查询,但我正在使用两个插件。我对 SQL 或 MetaSearch 或 Kaminari 如何工作的了解不够,不知道如何查找问题和/或解决问题。
-
好吧,
.search方法仅适用于 activerecord 对象,因此将其链接到数组 (photo_ids) 不起作用。
标签: ruby-on-rails postgresql group-by