2

У меня есть следующие модели:Найти записи в глубоко вложенных ассоциациях с рельсами

class Book < ApplicationRecord 
    has_many :chapters 
end 

class Chapter < ApplicationRecord 
    belongs_to :book 
    has_many :pages 
end 

class Page < ApplicationRecord 
    belongs_to :chapter 
    has_many :paragraphs 
end 

class Paragrpah < ApplicationRecord 
    belongs_to :page 
end 

Теперь я хочу, чтобы получить список всех пунктов в конкретной книге. Что-то вроде:

@parapgraphs = Paragraph.pages.chapters.book.where(:title => 'My Book') 

Когда я делаю это, я получаю:

undefined method 'chapters' for 'pages' 

Я использую Rails 4.2 и Ruby, 2,2

+0

Метод главы должен быть «глава», как в : @parapgraphs = Paragraphs.pages.chapter.book.where (: title => 'My Book') – bkunzi01

+0

Это должно сделать трюк 'Paragraphs.includes (page: {chapter:: book}). где (книги: {title : 'Моя книга' }) '(аналогично http://stackoverflow.com/questions/18082096/rails-4-scope-to-find-parents-with-no-children/) – MrYoshiji

ответ

5

Если вы хотите связь между любой из этих объектов, чтобы всегда быть присутствовать и запрашивать, подумайте о добавлении отношения has_many.

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

Если это еще один раз запрос а, вы могли бы сделать что-то вроде этого

@paragraphs = Paragraph.joins(page: { chapter: :book }).where(books: { title: 'My Book' }) 
+0

Предложение where использует имя таблицы, а не имя отношения (должно быть 'где (книги: {title: 'some title'})') – MrYoshiji

+0

Вы правы, моя ошибка! –

1

Попробуйте вместо

@paragraphs = Book.find_by(title: 'My book').chapters.map{ |c| c.pages.map{ |p| p.paragraphs.to_a }.flatten }.flatten 
+0

Это может занять много времени, чтобы вычислить. Вы должны использовать SQL, когда можете, а не использовать Ruby. Особенно в этом случае – MrYoshiji

+0

Правда, это было скорее из-за грязных –