user2371769
user2371769

Reputation: 47

How to define scope to get one record of a has_many association?

class User
    has_many :posts do
      def latest(report_date)
        order(:report_date).where('report_date <= ?', report_date).limit(1)
      end
    end
end

class Post
    belongs_to :user
end

I would like to retrieve the records of user with the last post for each user.

I could do this:

users = User.all.map{|user| user.posts.latest(7.weeks.ago).first}.compact

Is there a better way to write this? something like:

users = User.posts.latest(7.weeks.ago).all

if that were valid?

Upvotes: 1

Views: 994

Answers (1)

Mark Swardstrom
Mark Swardstrom

Reputation: 18080

I tend to add something like this. Would it work in your case? It's nice because you can 'include' it in list queries...

class User < ActiveRecord::Base
  has_many :posts
  has_one :latest_post, :class_name => 'Post', :order => 'report_date desc'

  ...

end

In practice, you would do something like this in the controller:

@users = User.include(:latest_post)

And then, in the view where you render the user, you could refer to user.lastest_post and it will be eager loaded.

For example - if this was in index.html.haml

= render @users

you can access latest_post in _user.html.haml

= user.name
= user.latest_post.report_date

Upvotes: 2

Related Questions