Rails Query для лучшего способа выбрать самую последнюю запись - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть этот метод, который я хочу, чтобы я выбрал самое последнее activity_id для соответствующего user_id из модели UserActivity, которая отслеживает все действия пользователя и из этого получает description Activity_id от другой модели Activity. Функция работает нормально, но время от времени выдает ошибки "Не удалось найти активность_идентификатора". Может быть, мог бы быть лучший способ реализовать это или я здесь что-то не так делаю?

def last_activity(date, user_id)
  active_id = UserActivity.find(:all, :conditions => ["Date(updated_at) <= ? and user_id = ?", date, user_id]).last.activity_id
  text = Activity.find(active_id).description
end

Схема модели UserActivity выглядит следующим образом: enter image description here

Пожалуйста, помогите мне исправить это. Спасибо !!

Ruby версия 1.8.7, Rails 2.1.2

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Если у вас есть следующие модели

class User
  has_many :user_actvities
  has_many :activities, :through => :user_actvities, 
    :order => "user_actvities.id"
end

class UserActivity
 belongs_to :user
 belongs_to :activity
end

class Actvity
  has_many :user_actvities
  has_many :users, :through => :user_actvities
end

Для получения последней активности текущего пользователя

current_user.activities.last

Это зависит от того факта, что объект UserActivity с максимальным идентификатором является последним действием.

Если вы обновляете UserActivity после создания, вы должны изменить предложение order ассоциации, т.е.

has_many :activities, :through => :user_actvities, 
  :order => "user_actvities.updated_at"
0 голосов
/ 20 февраля 2012

Либо в запросе не найдено ни одного совпадения, либо в некоторых записях могут быть значения null для столбца Activity_id, следующий код должен работать

user_activity = UserActivity.find(
   :all, :conditions => ["DATE(updated_at) <= ? AND user_id = ? AND activity_id IS NOT NULL", date, user_id], 
   :order => "updated_at DESC", :limit => 1).first
text = Activity.find(user_activity.active_id).description rescue nil
...