Rails: метод поиска ломает PostgreSQL, альтернативы? - PullRequest
2 голосов
/ 28 марта 2011

В моем приложении есть следующий метод:

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

Это поиск фотографий, на которых много тегов в тегах.

Этот метод берет список тегов через запятую и возвращает все фотографии, связанные с тегами с заданными именами.

Проблема в том, что он разбивает PostgreSQL со следующим сообщением об ошибке:

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):

В другом, несколько схожем вопросе ответчик предположил, что при использовании .group() необходимо включать все столбцы в таблице. Это кажется мне безумным - какого черта смысл .group, если вы можете использовать его, только набрав все поля в вашей модели. Это хрупко, и в целом это плохая идея.

Кто-нибудь может предложить альтернативный способ заставить этот метод работать с PostgreSQL?

1 Ответ

2 голосов
/ 28 марта 2011

Взгляните на эту статью .

Одним из предложений («Вариант 2») является добавление select("distinct photos.*") перед вашим присоединением.Я никогда не делал этого, но это стоит попробовать;безусловно, лучше, чем помещать каждое выбранное поле в статистическую функцию.

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