Показать последнюю запись для текущего пользователя (ID), где ID находится в 2 отдельных полях - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь написать небольшой Messagecenter для моего проекта.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу показать только самое последнее сообщение от пользователя или пользователю, будет показано последнее сообщение.

Таблица имеет идентификатор Sender_ID, Receiver_ID и MessageTXT.

До сих пор я использовал:

@messages = Message.find_by_sql("select * from messages where id IN(SELECT MAX( id ) FROM messages WHERE sender_id = #{current_user.id} OR receiver_id = #{current_user.id} GROUP BY sender_id, receiver_id )")

Что дает мне последнее сообщение и последнее сообщение от другого пользователя.

Ответы [ 4 ]

3 голосов
/ 30 января 2012

Вы должны быть в состоянии сделать это с именем scope и не должны использовать find_by_sql, который действительно является последним средством.

Пример:

class Message < ActiveRecord::Base
  scope :for_user, lambda { |user_id|
    where([ 'sender_id=? OR receiver_id=?', user_id, user_id)
  }
end

С помощью этого вы можете получить последний:

@last_message = Message.for_user(user_id).order('id DESC').first

Это должно сгенерировать запрос, аналогичный тому, который вы определили.

0 голосов
/ 30 января 2012
@messages = Message.find_by_sql("select * from messages 
      WHERE sender_id = #{current_user.id} OR receiver_id = #{current_user.id}")

или вам не нужно использовать find_by_sql, вы можете сделать это как

@messages = Message.find(:all, :conditions => ["sender_id = ? or
                          receiver_id = ?", current_user.id, current_user.id]);

это вернет массив соответствующих условий, упорядоченных по идентификатору по умолчанию. Помните, что идентификатор автоматически создается и увеличивается, так что последнее сообщение будет иметь самый высокий идентификатор, чтобы вы могли получить последнее сообщение, как показано ниже

@last_message = @messages.last
0 голосов
/ 30 января 2012
Message.where("sender_id = :user_id OR receiver_id = :user_id", {:user_id => current_user.id}).order('created_at').last

Это должно создать запрос SQL, который перечисляет все сообщения, где ваш пользователь является отправителем или получателем, сортирует их по дате создания и дает вам последнее.

Я отсортировал сообщенияс их датой создания вместо идентификатора, потому что БД не может использовать идентификаторы автоинкремента.Чтобы повысить эффективность, попробуйте добавить индекс в столбец created_at.

Также избегайте использования «# {...}» в запросе SQL, специальные символы могут обрабатываться некорректно, и это уязвимо для внедрения SQL.

0 голосов
/ 30 января 2012

Я думаю, что проблема с вашим запросом в том, что вы забыли указать заказ и забыли указать «LIMIT 1».Вы должны посмотреть на ответ Тэдмана, чтобы лучше это сделать.

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