ruby on rails如何从最新的记录中获得很多关系

时间:2015-03-28 19:57:34

标签: ruby-on-rails ruby has-many

我是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) - 但这是非常低效的,因为我有很多数据。你有什么想法我怎么做到这一点?也许某种范围相互链接?

4 个答案:

答案 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