Есть ли лучший способ объединить эти таблицы в ActiveRecord снизу вверх? - PullRequest
0 голосов
/ 27 февраля 2012

Автор has_many Books

Books has_many Содержимое

Если я хочу найти какой-то дубликат раздела, например: "интереса", во всех книгах и всех авторах.И я также хотел бы видеть их book.title и author.name.

content_section = Content.where(:section  => "interest").select("book_id, section ";

books = Books.where(:id => content_section.map(&:book_id)).select("author_id, title")

authors = Author.where(:id => books.map(&:author_id)).select("name")
  • Вопрос1: Есть ли лучший способ добиться этого?(в проблеме производительности или некоторых других)

  • Вопрос 2: Есть ли способ сделать так, чтобы разделы, книги и авторы объединялись в таблицу?(на стороне ruby ​​или MySQL.)

  • Вопрос3: что означает content_section.map (&: book_id)?Интересно, например, из-за &: book_id

этот SQL (MySQL) создаст большую таблицу, поэтому мне не нужно объединять все результаты в ruby.И мне легче повторять в шаблонах представлений.Но это производительность очень низкая, так как присоединились три таблицы.

select * from authors, books, contents 

where authors.id = books.author_id and books.id = content.book_id and content.section = "interest"

Любой комментарий приветствуется.Спасибо.

** обновление **

после ссылки: введите описание ссылки здесь и введите описание ссылки здесь

Я пытаюсь добавить модель:

класс Автор

has_many: content, through => book

end

, затем я попытался это в консоли:

author.joins (: content) .where (: section => Interest)). Select ("name, title, section:);

Я получаю SQL:

выберите имя, заголовок, раздел из автора......

  • Это нормально? Спасибо.

1 Ответ

1 голос
/ 28 февраля 2012

Это может сделать это:

class Author
  has_many :books
  has_many :contents, :through => :books

  scope :by_section, lambda { |section| joins(:contents).where('contents.section' => section) }
end

Тогда вы можете позвонить:

authors = Author.by_section("interest")

Кроме того, вы задавались вопросом о content_sections.map(&:book_id). Это сокращение для content_sections.map { |content_section| section.book_id }, которое приводит к массиву идентификаторов книг.

...