Rails查询选择最新记录的最佳方法

时间:2012-02-20 06:52:18

标签: mysql ruby-on-rails ruby ruby-on-rails-2

我有这种方法,我希望我从模型activity_id中获取相应user_id的最新UserActivity,跟踪所有用户活动,然后从中获取来自另一个模型description的activity_id的Activity。 该函数工作正常,但有时会抛出“无法找到activity_id”的错误。可能有更好的方法来实现这个或我在这里做错了吗?

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 个答案:

答案 0 :(得分:2)

假设您有以下模型

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

这依赖于具有最大id的UserActivity对象是最新活动的事实。

如果在创建后更新UserActivity,则必须更改关联的order子句,即

has_many :activities, :through => :user_actvities, 
  :order => "user_actvities.updated_at"

答案 1 :(得分:0)

查询未查找任何匹配项或某些记录可能具有activity_id列的null值,以下代码可以正常工作

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