2013-11-27 26 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