2013-11-27 24 views
1

我有以下型号:提前查询在轨

class Author < ActiveRecord::Base 
    has_many :books 
end 

class Book < ActiveRecord::Base 
    belongs_to :author 
end 

如何创建一个查询来获取5本书,从不同的作家他们中的每一个?

另一个条件是,如果我的作者少于5人,我仍然应该得到5本书,每个作者一本书,其余的书可以来自任何这些作者。

+0

请发布您到目前为止所尝试过的内容。 – Josh

+0

嗨乔希。我有一个基于http://apidock.com/rails/ActiveRecord/SpawnMethods/merge的想法,但这只是解决了超过5个作者的情况 – marrossa

回答

0

让我们的5名随机作者首先:

authors = Author.all.order('random()').limit(5) 

现在让我们尝试让一本书为每一个

chosen_books = [] 
authors.each do |author| 
    chosen_books << author.books.order('random()').first 
end 

现在,我们可以检查,如果我们还是短书

if chosen_books.size < 5 
    already_chosen_book_ids = chosen_books.map(&:id) 
    limit = 5 - chosen_books.size 
    extra_books = Book.where(author: authors).where('id NOT IN (?)', already_chosen_book_ids).order('random()').limit(limit) 
    chosen_books = chosen_books.concat(extra_books.to_a) 
end