Поисковая логика по ассоциациям
У меня есть следующие ассоциации:
class BookShelf {
has_many :books
}
class Book {
has_many :pages
belongs_to :book_shelf
}
class Page {
belongs_to :book
}
Если у меня есть объект BookShelf, как я могу использовать searchlogic для поиска страниц, которые принадлежат книгам в текущей книжной полке?
В настоящее время я использую это:
@bookshelf = BookShelf.find 1
@pages = Page.title_like("something").book_id_equals(@bookshelf.books.map { |book| book.id }).paginate :page => params[:page]
Таким образом, часть paginate - это просто использование will_paginate, которое на самом деле не имеет отношения к делу.
Дело в том, что я думаю, что эти строки кодов несколько уродливы. Есть ли улучшения?
1 ответ
Решение
Это должно сделать свое дело и избавить от необходимости отображать все идентификаторы книг в массив:
Page.title_like("something").book_bookshelf_id_equals(@bookshelf.id).paginate(:page => params[:page])
Я протестировал его в одном из моих приложений, где у меня была похожая структура модели (Suburb -> Region -> State) с использованием следующего:
Suburb.name_like("east").region_state_name_like("vi").paginate(:page => 3)
Который, казалось, делал свое дело.