ruby 关于 rails 如何获取最新记录有很多关系

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

我是 Rails 上 Ruby 的新手。我有一个问题-如何只从模型中有很多关系获取最新记录。我的代码是这样的:

class User < ActiveRecord::Base 
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :user

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

我想要实现的是:我想为每个用户获取所有最新(最后)的书,而不是使用范围评级过滤这些书。我可以使用 for each 循环来做到这一点(循环 User.books 并得到 book.last)——但这非常低效,因为我有很多数据。你知道我该怎么做吗?也许某种范围相互链接?

试试这个:

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

在上面的示例中,请注意 .order('id DESC').limit(10)。这将按 ID 降序排列书籍。

只需使用last方法并将您想要的记录数传递给参数:

user.books.last(5).rating

这将为您提供最后 5 本书并为其应用评级。

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

如果你想避免写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

那么您所要做的就是:

Book.rating.latest

每个用户一本书,然后将结果限制为仅评级为 5 的用户,一个查询没有循环或任何东西。

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