PostgreSQL, Rails + Heroku, столбец должны появляться в «group by» - PullRequest
2 голосов
/ 28 марта 2011

Я получаю эту ошибку при развертывании приложения в 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 прервется.

Это пугает меня по нескольким причинам:

  1. Моя фотомодель довольно сложна и имеет массу полей.
  2. Мое приложение все еще находится в разработке, и фотомодель меняется больше, чем любая другая.
  3. Я не хочу, чтобы мой код нарушался каждый раз, когда кто-то касается фотомодели в будущем, если он забудет добавить столбцы в оператор группы в аргументе поиска тега.

Итак, кто-нибудь может помочь мне понять, как переписать этот метод, чтобы он не сломал PostgreSQL - и в идеале, чтобы мне не пришлось включать в решение список всех полей, принадлежащих этой модели. или, по крайней мере, не поддерживаемый вручную список?

1 Ответ

1 голос
/ 28 марта 2011

Итак, оказалось, что я мог решить эту проблему, заменив «group» на «select» в моем методе tagged_with.

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

Проблема решена! См. Эту статью для лучшего объяснения того, почему эта идея в любом случае лучше. (Извините, сайт был удален позже, и я не помню, что он сказал.) Кроме того, спасибо Марк Уэстлинг за ответ на дополнительный вопрос, который решил мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...