我是Ruby on Rails的新手。我有一个问题 - 如何只从模型中获得许多关系的最新记录。我的代码是这样的:
class User < ActiveRecord::Base
has_many :books
end
class Book < ActiveRecord::Base
belongs_to :user
scope :rating, -> { where(rating: 5) }
end
我想要达到的目标是:我想为每个用户获取所有最新(最后)的书,而不是使用范围评级来过滤这本书。我可以使用每个循环(循环通过User.books并获取book.last) - 但这是非常低效的,因为我有很多数据。你有什么想法我怎么做到这一点?也许某种范围相互链接?
答案 0 :(得分:2)
如果你想避免编写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
答案 1 :(得分:0)
试试这个:
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
我想为每位用户提供最新(最后)的书
在上面的示例中,请注意.order('id DESC').limit(10)
。这将按ID降序排列书籍。
答案 2 :(得分:0)
每个用户一本书,然后将结果限制为只有评分为5,一个查询没有循环或任何事物的人。
Book.order(created_at: :desc).group(:user_id).rating
答案 3 :(得分:-1)
只需使用last
方法并将所需的记录数传递给参数:
user.books.last(5).rating
这将为您提供最后5本书并对其应用评级。
请参阅http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-last