Joanna
Joanna

Reputation: 63

ruby on rails how to get latest records from has many relationship

I am new to Ruby on Rails. I have a problem- how to get only latest records from has many relationship in model. My code is like this:

class User < ActiveRecord::Base 
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :user

  scope :rating, -> { where(rating: 5) }
end

What I would like to achieve is: I'd like to get all latest (last) book for each user and than filter this books using scope rating. I can do this using for each loop (Looping through User.books and get book.last)- but this is very inefficient because I have a lot of data. Do you have any ideas how I can do this? maybe some kind of scope chaining with each other?

Upvotes: 6

Views: 4654

Answers (4)

SHS
SHS

Reputation: 7744

You can do this if you want to avoid writing SQL:

class Book < ActiveRecord::Base
  scope :latest, -> do
    book_ids_hash = Book.group(:user_id).maximum(:id)
    book_ids = book_ids_hash.values
    where(id: book_ids)
  end
end

Then all you have to do is:

Book.rating.latest

Upvotes: 4

Mohammad AbuShady
Mohammad AbuShady

Reputation: 42919

One book for each user, then limit the result to only those who have rating 5, one query no loops or any thing.

Book.order(created_at: :desc).group(:user_id).rating

Upvotes: 0

medBouzid
medBouzid

Reputation: 8442

Just use last method and pass the number of records you want to the parameter :

user.books.last(5).rating

this will give you the 5 last books and apply the rating to it.

see http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-last

Upvotes: -1

oldhomemovie
oldhomemovie

Reputation: 15139

Try this:

User.find_each do |user|
  puts 'User top 10 books:'

  user.books.rating.order('id DESC').limit(10).each do |book|
    puts book.title 
  end
end

I'd like to get all latest (last) book for each user

In the example above, note the .order('id DESC').limit(10). This will sort books by ID in descending order.

Upvotes: 0

Related Questions