Поисковая логика по ассоциациям

У меня есть следующие ассоциации:

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)

Который, казалось, делал свое дело.

Другие вопросы по тегам