Reputation: 63
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
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
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
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
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