Переопределение находки в отношениях Mongoid has_many - PullRequest
0 голосов
/ 29 марта 2012

Использование Mongoid 2.4.5 на Rails 3.2.1

У меня есть модель Book, которая has_many :pages.

class Book
  include Mongoid::Document

  has_many :pages
end

class Page
  include Mongoid::Document

  field :page_number
  belongs_to :book
  validates_uniqueness_of :page_number, scope: :book
end

Я использую вложенные ресурсы, чтобы я могполучить URL-адреса вроде /books/4f450e7a84b93e2b44000001/pages/4f4bba1384b93ea750000003/

То, что я хотел бы сделать, это использовать URL-адрес типа /books/4f450e7a84b93e2b44000001/pages/3/, чтобы получить третью страницу в этой книге.

Теперь сутьвопроса: Я хочу найти страницу с помощью вызова типа Book.find('4f450e7a84b93e2b44000001').pages.find('3') или как Book.find('4f450e7a84b93e2b44000001').pages.find('4f4bba1384b93ea750000003')

Я знаю, что могу переопределить метод find в Page чем-то вроде

  class << self
    def find(*args)
      where(:page_number => args.first).first || super(args)
    end
  end

Но, похоже, это не оказывает никакого влияния на запрос в области book.pages.find('3'), так как кажется, что поиск в области использует другой метод поиска.

Как конкретно переопределить поискметод, используемый book.pages.find('3')?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Почему просто укажите критерии "где" на ваших страницах?

Book.find('4f450e7a84b93e2b44000001').pages.where( :page_number => '3')

Вы можете сделать область на своих страницах

class Page
  scope :page_number, lambda{|num| where(:page_number => num) }
end

и используйте его как:

Book.find('4f450e7a84b93e2b44000001').pages.page_number('3')
0 голосов
/ 29 марта 2012

Определите метод to_param в вашей модели страницы, который возвращает номер страницы.Таким образом, все помощники Rails URL используют это при создании URL (автоматически).Тогда вы можете просто использовать что-то вроде

@book.pages.where(:page_number => params[:page_id]) # page_id is actually the result of page#to_param

Кстати.Я не знаю, насколько велики ваши книги, но, возможно, имеет смысл встраивать ваши страницы в книгу с точки зрения ориентированной на документы базы данных.Весь бизнес отношений не является родным для MongoDB.

...