2013-11-27 2 views
1

У меня есть следующие модели:Advance запрос в рельсах

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