Przed rozpoczęciem pracy konieczne jest skonfigurowanie bazy oraz załadowanie danych:
$:.unshift "."
require 'db_setup'
require 'db_load'
W dalszych zadaniach będzie wykonywać polecenia korzystając z następujących klas, zmapowanych na odpowiadające im table w bazie danych:
class Author < ActiveRecord::Base
# name (string)
# surname (string)
# born (datetime)
# died (datetime)
# image_url (string)
has_many :books
end
class Book < ActiveRecord::Base
# title (string)
# author (Author)
# published (integer)
belongs_to :author
end
ActiveRecord udostępnia interfejs pozwalający wyszukiwać dane w bazie również z wykorzystaniem związków zdefiniowanych pomiędzy
klasami. Do definiowania tych związków służą polecenia has_many
, belongs_to
, has_one
oraz has_and_belongs_to_many
.
Przykładowo jeśli chcemy dowiedzieć się kto był autorem pierwszej książki wykonujemy zapytanie:
book = Book.first
puts book.title
puts book.author
Niestety prezentowany wynik nie jest zbyt użyteczny. Ponieważ jednak metoda author
zwraca obiekt, możemy na nim wywoływać
metody - tak samo jak w przypadku autora załadowanego bezpośrednio z wykorzystaniem metod zdefiniowanych dla klasy Author
book = Book.first
puts book.title
puts "#{book.author.name} #{book.author.surname}"
Co więcej, jeśli mamy do czynienia ze związkiem jeden-do-wiele bądź wiele-do-wiele, możemy wywyływać wszystkie dotychczas poznane metody na kolekcji powiązanych obiektów. Istotnie ułatwia to wyszukiwanie potrzebnych danych:
books = Book.where("title like 'A%'")
books.each do |book|
puts book.title
end
author = Author.where(surname: "Tołstoj").first
books = author.books.where("title like 'A%'")
books.each do |book|
puts book.title
end
Różnica pomiędzy tymi zapytaniami polega na tym, że w pierwszym przypadku szukamy książki, których tytuł zaczyna się na "A" w całym zbiorze książek, a w drugi przypadku wśród książek napisanych przez Tołstoja.
Aby umożliwić formatowanie wyników zapytania, IRuby udostępnia metodę IRuby.html
, która pozwala na wyświetlanie kodu
HTML. Przykładowo
IRuby.html "<h1>Test HTML-a</h1>"
Dzięki temu będziemy mogli formatować wyniki zapytań, a wszczególności wyświetlać obrazy przedstwiające autorów oraz książki. Należy jednak wziąć pod uwagę, że nie wszystkie książki oraz nie wszyscy autorzy posiadają odpowiadające im obrazki. Aby wyświetlić imię, nazwisko oraz obraz pierwszego autora piszemy:
author = Author.where("image_url is not null").first
IRuby.html "<h1>#{author.name} #{author.surname}</h1><img src='#{author.image_url}'/>"
Możemy również zdefniować funkcję, np. display_author
, której zadaniem będzie wyświetlenie autora w tej postaci.
Jedyny problem polega na tym, że funkcja IRuby.html
może być wywoływana tylko raz. Dlatego jeśli chcemy wyświetlić kilku autorów,
musimy połączyć odpowiadające im kody HTML i wynik przekazać do funkcji html
def display_author(author)
"<h1>#{author.name} #{author.surname}</h1><img src='#{author.image_url}'/>"
end
author_1 = Author.where("image_url is not null").first
author_2 = Author.where("image_url is not null").offset(1).first
document = display_author(author_1)
document += display_author(author_2)
IRuby.html document
Wyświetl wszystkich autorów, którzy urodzili się przed rokiem 1900.
Zmodyfikuj funkcję wyświetlającą autorów tak aby obejmowała ich datę urodzin i śmierci w formacie dzień.miesiąc.rok
. Następnie wyświetl wszystkich autorów,
którzy zmarli w XX wieku.
Wyświetl 5 najmłodszych autorów, którzy posiadają przypisane zdjęcie.
Zdefiniuj funkcję display_book
, która będzie zwracała fragment kodu HTML obejmujący tytuł książki, rok jej wydania oraz
przypisany obrazek.
Wyświetl najwcześniej wydaną książkę.
Wyświetl wszystkie książki, które nie mają przypisanego roku wydania.
Zmodyfikuj funkcję display_author
tak, aby wyświetlała również wszystkie książki napisane przez autora. Użyj znacznika <ul>
.
Korzystając z tej funkcji wyświetl opis Stanisława Lema.
Wśród książek napisanych przez Lema wyświetl wszystkie, które zawieraja w tytule słowo "zbiór".
Wśród książek napisanych przez Lema wyświetl te, które zostały wydane w roku jego śmierci.
Wyświetl wszystkie książki znajdujące się w bazie. Opis powinien zawierać tytuł, imię i nazwisko autora, rok wydania oraz obraz przedstawiający książkę (o ile istnieje).
Wyświetl wszystkich autorów znajdujących się w bazie wraz z opisem zawierającym ich zdjęcie, datę urodzin i śmierci oraz spis opublikowanych książek. Pamiętaj o odpowiednim sformatowaniu dat oraz o tym, że nie wszyscy autorzy mają przypisane wszystkie informacje.