Ruby on rails PostgreSQL,Rails+Heroku,列必须出现在“分组依据”中
在Heroku上部署我的应用程序时出现此错误:Ruby on rails PostgreSQL,Rails+Heroku,列必须出现在“分组依据”中,ruby-on-rails,postgresql,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_
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'
我看到了这些类似的问题
问题是,此视图中没有任何内容要求自定义标题属性,也没有使用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(' | ')
def search
@curator_toolbar = true
@collection = Collection.find(params[:id])
@search = @collection.photos.search(params[:search])
@photos = @search.page(params[:page]).per(20)
end
以下是引发错误的CollectionSearch操作:
- ((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(' | ')
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 problem
因此,在中,它似乎表明我需要将照片模型中的每一列都放在组参数中,否则Postgre将中断
这让我感到恐惧的原因有几个:
我的照片模型非常复杂,有很多字段。
我的应用程序仍在开发中,照片模型的变化比任何其他应用程序都要大。
我不希望以后每次有人触摸照片模型时,如果他们忘记在标记搜索参数的group语句中添加列,我的代码就会中断。
那么,有谁能帮助我理解如何重写这个方法,使它不会破坏PostgreSQL?理想情况下,这样我就不必在解决方案中包含属于此模型的所有字段的列表,或者至少不必手动维护列表?,事实证明,我可以通过在我的tagged_with方法中将group替换为select来解决这个问题
问题解决了!请参阅这篇文章,了解为什么这是一个更好的想法。很抱歉,网站后来被删除了,我不记得它说了什么。另外,感谢他对一个衍生问题的回答,这个问题解决了我的问题。GROUP BY photos.id LIMIT 20 OFFSET 0-你从MySQL中提取了这个,我没有从任何地方提取任何SQL,我是一个SQL白痴-因此这个问题。你知道Kaminari和/或元搜索吗?你知道哪一个会生成这个查询吗?只有MySQL和SQLite支持你发布的声明中的功能。太好了,我相信你!现在,您是否对查询的起源有任何建议,以便我可以修复它?我没有在代码中编写任何查询,但我使用了两个插件。我对SQL或MetaSearch或Kaminari的工作原理了解不够,不知道如何查找问题和/或修复问题。好吧,.search方法只适用于activerecord对象,因此将其链接到数组photo_id不起作用。链接已失效。这是我们不喜欢外部链接的原因之一。如果你还记得为什么它说这个主意很棒,请编辑并总结。@RichardTheKiwi链接被删除,对不起,我不记得它说了什么。