ORDER po kolumnie z tabeli nadrzędnej

Witajcie,

Mam 2 tabele

authors
id: integer 
name: string

i drugą

books
id: integer
author_id: integer
title: string

Pragnę wyświetlić tabelę books posortowaną.
W books_controller.rb mam wpis:

  def index
    @books = Book.all.order(:title)
  end

czyli sortuje po tytule. Jeżeli wpiszę:

  def index
    @books = Book.all.order(:author_id, :title)
  end

to sortuje po id_autora i tytule ksiażki.

Czy można, a jeżeli tak, to jak, wylistować książki posortowane po nazwisku (authors.name) autora i w drugiej kolejności po tytułach (books.title)?

Czy też muszę kombinować z zapisywaniem danych w tabeli books, tak by w chwili “save” zapisywał mi nie tylko author_id ale też w dodatkowej kolumnie author_name?
(przyznam, że nie podoba mi się to, bo następuje redundancja danych i może być w przyszłości problem z integralnością ich)

możesz zrobić joina tabel books i authors. Jeśli zdefiniowałeś relację (np book belongs_to: :author), to Book.joins(:author).order(“authors.name, bookst.title”)

i z takiego joina (np. BookAndAuthor) wybierać

def index
 @books = BookAndAuthor.all.order(:name, :title)
end

?

Nie chodzi mi o tworzenie modelu, reprezentującego joina (tak rozumiem Twoje BookAndAuthor, w activerecordzie to niekonwencjonalne rozwiązanie), tylko o użycie activerecordowej klauzuli joins na Book (zadziała, jeśli relacja z authors jest zdefiniowana, czyli w modelu Book masz belongs_to :author).
Efektem tego joina jest activerecordowe proxy, na którym możesz odpalać inne activerecordowe metody (m.in. order, przy czym w takim order dobrze jest użyć jednoznacznych nazw kolumn, czyli np order(“authors.name, books.title”)).

Macieju,
mam zdefiniowane w modelach:

  • w authors has_many
  • w books belongs_to

Jak widzisz jestem zielony, pytam w zielonej szkole i ogólnie piszę na zielono :wink: …więc, czy mógłbyś napisać te dwie linijki kodu o którym wspominasz ? :slight_smile:

def index
...........
end

juz ci odpisal

def index
  @books = Book.joins(:author).order("authors.name, bookst.title")
end

mozna by to duzo ladniej zrobic ale jak jestes zupelnie zielony to bedzie ok

Dzięki,
a podpowiesz jak powinno być “dużo ładniej”?

Najlepiej bylo by przeniesc ten kod do modelu jako scope ew metode (http://guides.rubyonrails.org/active_record_querying.html#scopes)

Sądziłem, że scope należy stosować do wybierania zakresu widzianych rekordów, a nie porządkowania, ale dzięki za sugestię. Na pewno przeczytam. :smile:

Dzięki Wam za pomoc