Я получаю эту ошибку при развертывании приложения в 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 для нумерации страниц. У кого-нибудь есть какие-либо идеи или предложения относительно того, что могло бы вызвать это конкретно, и как я могу это исправить?
- EDIT -
Хорошо, похоже, я нашел реальную проблему:
Используя 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".
Итак, в этот вопрос , кажется, указывает на то, что мне нужно поместить каждый столбец, являющийся частью моей фотомодели, в аргумент "group", иначе Postgre прервется.
Это пугает меня по нескольким причинам:
- Моя фотомодель довольно сложна и имеет массу полей.
- Мое приложение все еще находится в разработке, и фотомодель меняется больше, чем любая другая.
- Я не хочу, чтобы мой код нарушался каждый раз, когда кто-то касается фотомодели в будущем, если он забудет добавить столбцы в оператор группы в аргументе поиска тега.
Итак, кто-нибудь может помочь мне понять, как переписать этот метод, чтобы он не сломал PostgreSQL - и в идеале, чтобы мне не пришлось включать в решение список всех полей, принадлежащих этой модели. или, по крайней мере, не поддерживаемый вручную список?