2016-02-07 3 views
0

У меня есть Post и User объектов в моей заявке.Ruby On Rails ActiveRecord выберите материал с условием WHERE

У них есть belongs_to и has_many отношения соответственно. Я использую gem devise в качестве системы авторизации/аутентификации пользователя.

Этот фрагмент кода выбирает все сообщения, если Post имеет user_id, и это так же, как current_user.id, и присваивает его переменной экземпляра:

@post = Post.where(:user_id => current_user.id) 

вопрос:

Как я мог выбрать последнее Сообщение создано пользователем (думаю, я бы использовал .last метод для достижения этого)

Но проблема в том, что я не знаю, как использовать .where и .last в одном запросе внутри моей переменной экземпляра.

ответ

2

Метод ActiveRecord where возвращает объект привязки ActiveRecord. Это означает, что вы можете просто наложить на него другие методы AR. Есть несколько способов сделать это.

@post = Post.where(user: current_user) 

Обратите внимание, что вы можете передать where объект без указания идентификатора. Например, where(user: current_user) в отличие от where(user_id: current_user.id). AR выясняет, что вы пытаетесь сделать.

Вы также можете пройти через пользователь.

@post = current_user.posts.last 

Но будьте осторожны, что last может не обязательно делать то, что вы хотите. Он использует объект id по умолчанию. Это означает, что сообщения, обновленные в последнее время, могут не иметь приоритета. Если вы используете мягкие удаления, это также может быть проблемой. Возможно, вы захотите явно добавить в состояние created_at или updated_at.

@post = current_user.posts.order(created_at: :desc).last 

Возможно, вы захотите обернуть это в область видимости.

class Post 
    scope :most_recent, -> { order(created_at: :desc).last } 
end 
@post = current_user.posts.most_recent 
0

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

В Вашей почтовой модели можно определить область применения, как последние

scope :recent, -> { order(created_at: :desc) } 

@post = current_user.posts.recent.first 
-2

я решил мою проблему.

Это работает для меня как шарм:

@post = Post.joins(:user).where(posts: { user_id: current_user.id }).last 
+1

Это не лучший способ пойти об этом. Вы делаете ненужное соединение. – Mohamad

+0

Да, сделайте рефакторинг через несколько минут. Спасибо за Ваш ответ! –

Смежные вопросы