2012-02-20 11 views
0

私は、の対応するuser_idを、UserActivityというモデルからフェッチして、すべてのユーザーアクティビティを追跡し、その結果からdescription他のモデルのactivity_idのActivity。 この関数は正常に動作しますが、時には "Activity_idを見つけることができません"というバグがスローされます。これを実装するより良い方法があるかもしれませんか、私はここで何か間違っていますか?次のようにRails最新のレコードを選択する最善の方法を問い合わせる

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

+0

を示すべき値がないときのバグがあなたに起こることがありますか?この場合、 'last.activity_id'は無関係かもしれません。ここの答えはあなたを何とか助けますか? :http://stackoverflow.com/questions/4966430/model-find1-gives-activerecord-error-when-id-1-does-not-exist – sarath

答えて

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 
+0

UserActivityとActivityは完全に2つの異なるモデルです... UserActivityはすべてのユーザーアクティビティと関数内で日付とユーザーIDを指定すると、その日付の中でユーザーの最新のアクティビティをフェッチし、そのactivity_idからフェッチする必要があります。 –

+0

あなたのコメントに対してコードを更新しました。 – nkm

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" 
関連する問題