ruby-on-rails - PostgreSQL, Rails + Heroku, Column 必须出现在 "group by"

标签 ruby-on-rails postgresql group-by

当我在 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'

我看到了这些类似的问题(12)。

问题是,此 View 中没有任何内容要求 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. 我不希望以后每次有人触摸照片模型时,如果他们忘记将列添加到标签搜索参数的组语句中,我的代码就会被破坏。

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

最佳答案

事实证明,我可以通过在我的 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

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

关于ruby-on-rails - PostgreSQL, Rails + Heroku, Column 必须出现在 "group by",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453477/

相关文章:

ruby-on-rails - has_many 和 belongs_to 协会在 factory_girl

ruby-on-rails - 使用 ERB 打印数组元素

java - Spring Boot 2.0 - 禁用连接到数据库

SQL获取A列相同,B列不同的记录

sql - 根据列的最大值从行中选择多列

MySQL Group by 查询消耗 20 倍的磁盘空间

ruby-on-rails - Mime::Type::InvalidMimeType ("charset=utf-8"不是有效的 MIME 类型)

ruby-on-rails - 如何为SimpleForm编写更简洁的日期选择器输入

r - 了解 dplyr group_by 与 tapply 之间的结果差异

oracle - 为什么 Oracle 不支持 "group by 1,2,3"?