SQLite для Postgres (Heroku) GROUP BY - PullRequest
3 голосов
/ 03 июня 2011

Следующие группы кодов SQLite Сообщения по разговорному идентификатору:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
          , current_user.id, current_user.id).group("messages.conversation_id")

При переходе на Heroku этот код не распознается Postgres. Глядя на журналы, мне сказали добавить все столбцы сообщений в GROUP BY - чтобы я получил этот функциональный код:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
          , current_user.id, current_user.id).group("messages.conversation_id
          , messages.updated_at, messages.id, messages.sender_id
          , messages.recipient_id, messages.sender_deleted
          , messages.recipient_deleted, messages.body, messages.read_at
          , messages.ancestry, messages.ancestry_depth, messages.created_at")

Только этот код неправильно группирует по разговорному идентификатору. Он просто выводит все сообщения, которые удовлетворяют условию WHERE. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 04 июня 2011

Я пришел к функциональному решению с использованием DISTINCT ON:

@messages = Message.select("DISTINCT ON (messages.conversation_id) * ")
                   .where("messages.sender_id = (?) OR messages.recipient_id = (?)", current_user.id, current_user.id)
                   .group("messages.conversation_id, messages.updated_at, messages.id, messages.sender_id, messages.recipient_id, messages.sender_deleted, messages.recipient_deleted, messages.body, messages.read_at, messages.ancestry, messages.ancestry_depth, messages.created_at")

Однако в SQLite это не сработает.Рекомендуется загрузить Postgres и использовать его напрямую, вместо того, чтобы использовать код SQLite при разработке и код Postgres в производстве (Heroku).

0 голосов
/ 04 июня 2011

PostgreSQL требует, чтобы вы сгруппировали все неагрегированные атрибуты. Группировка означает, что вам нужны уникальные комбинации сгруппированных атрибутов, поэтому спрашивать всю информацию не имеет смысла. Я не знаю о RoR, но вам нужно будет запросить только conversation_id (с возможной совокупной информацией, если вам это нужно). Но так как вы запрашиваете всю информацию в таблице сообщений, я думаю, вы, возможно, захотите сделать заказ по идентификатору разговора?

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