1

ユーザーは複数のメッセージを持つことができます:

class User < ActiveRecord::Base
  has_many :messages, :foreign_key => "publisher_id"
end

最新のメッセージ時間を取得するには、次のようにします。

class User < ActiveRecord::Base
  def last_message_time
    last_message = messages.max{ |m1, m2| m1.created_at <=> m2.created_at }
    last_message ? last_message.created_at : nil
  end
end

何らかの理由で、これを行うためのより良い方法があると確信しています。

これをどのように行いますか?

4

2 に答える 2

6

これは短いバージョンです:

# Ruby < 2.3.0
def last_message_time
  messages.order(:created_at).last.try(:created_at)
end

# Ruby >= 2.3.0
def last_message_time
  messages.order(:created_at).last&.created_at
end

更新(thx @ mnort9): Ruby>2.3.0用に更新

于 2011-08-09T13:11:56.913 に答える
4

少なくとも、データベースにソートを実行させることができます。

class User < ActiveRecord::Base
  def last_message_time
    last_message = messages.find(:last, :order => :created_at)
    last_message ? last_message.created_at : nil
  end
end
于 2011-08-09T13:09:27.953 に答える