Programowanie w Ruby Wykład 11 Marcin Młotkowski 19 grudnia 2014
Plan wykładu 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 2 / 38
Zasady Projekt Składowe projektu przynajmniej trzy modele; przynajmniej jedna relacja jeden do wielu; udokumentowana zgodnie z jakimś systemem gene rowania dokumentacji; testy; uwierzytelnienie użytkowników; przygotowana do dystrybucji w formie GEM ów Marcin Młotkowski Programowanie w Ruby 3 / 38
Termin Projekt 4 lutego 2015 Marcin Młotkowski Programowanie w Ruby 4 / 38
Plan wykładu Projekt Modele danych 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 5 / 38
Modele danych Projekt Modele danych Definicje danych Odczyt i zapis danych Kontrola poprawności danych danych Marcin Młotkowski Programowanie w Ruby 6 / 38
ORM object-relational mapping Modele danych Dane są reprezentowane i przetwarzane jako obiekty Dane są przechowywane w relacyjnych bazach danych Marcin Młotkowski Programowanie w Ruby 7 / 38
Moduł ActiveRecord Projekt Modele danych Definiuje model danych (tj. jego strukturę, związki między danymi, warunki poprawności) Zapewnia obiektowe tworzenie i dostęp do danych (bez udziału SQL a) Dba o zgodność modelu ze strukturą w bazie danych w przypadku migracji Marcin Młotkowski Programowanie w Ruby 8 / 38
Konwencje Projekt Modele danych Model Product Klasa Product w pliku app/models/product.rb W bazie danych jest tabela Products Plik(i) migracyjny(e) * create products.rb Marcin Młotkowski Programowanie w Ruby 9 / 38
Plan wykładu Projekt 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 10 / 38
danych Projekt Zmiana struktury danych Na początku struktura jest pusta, więc trzeba wykonać migrację (zerową) Można cofać zmiany w strukturze bazy danych Marcin Młotkowski Programowanie w Ruby 11 / 38
Szybka migracja Projekt W wierszu poleceń ruby script/generate model product bin/rails generate migration UtworzTabele Marcin Młotkowski Programowanie w Ruby 12 / 38
Plik migracyjny * create product.rb class CreateProducts < ActiveRecord::Migration def self.up end def self.down end end Marcin Młotkowski Programowanie w Ruby 13 / 38
Metoda self.up Projekt create_table :products do t t.column :przedmiot, :string, :null => false t.column :opis :text t.column :cena, :decimal, :precision => 10, :scale => 2, :default => 0.01 t.timestamps end Marcin Młotkowski Programowanie w Ruby 14 / 38
Metoda self.up Projekt create_table :products do t t.column :przedmiot, :string, :null => false t.column :opis :text t.column :cena, :decimal, :precision => 10, :scale => 2, :default => 0.01 t.timestamps end W nowszych wersjach metoda używa się nazwy change Marcin Młotkowski Programowanie w Ruby 14 / 38
Klucz główny Projekt Rails często potrzebuje klucza głównego Domyślnie zawsze dodawane jest pole id będące kluczem Marcin Młotkowski Programowanie w Ruby 15 / 38
Metoda self.down Projekt def self.down drop table :products end Marcin Młotkowski Programowanie w Ruby 16 / 38
Kolejne migracje Projekt $ ruby script/generate migration add column Marcin Młotkowski Programowanie w Ruby 17 / 38
Szkielet kolejnej migracji class AddColumn < ActiveRecord::Migration def self.up end def self.down end end Marcin Młotkowski Programowanie w Ruby 18 / 38
Implementacja migracji def self.up add columm :products, :qty, :integer end def self.down remove column :products, :qty end Marcin Młotkowski Programowanie w Ruby 19 / 38
Uruchomienie migracji $ rake db:migrate Marcin Młotkowski Programowanie w Ruby 20 / 38
Uruchomienie migracji $ rake db:migrate $ rake db:migrate VERSION=5 Marcin Młotkowski Programowanie w Ruby 20 / 38
Uruchomienie migracji $ rake db:migrate $ rake db:migrate VERSION=5 $ bin/rake db:migrate RAILS ENV=test Marcin Młotkowski Programowanie w Ruby 20 / 38
Obsługiwane silniki BD MySQL Sqlite DB2 Oracle Marcin Młotkowski Programowanie w Ruby 21 / 38
Konfiguracja Projekt config/database.yml development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 test:... production:... Marcin Młotkowski Programowanie w Ruby 22 / 38
Początkowa konfiguracja $ rails demo --database=sqlite3 Marcin Młotkowski Programowanie w Ruby 23 / 38
Obsługa danych poprzez przeglądarkę zbudowanie kontrolera ruby script/generate controller admin bin/rails generate controller admin (nowsze wersje) Marcin Młotkowski Programowanie w Ruby 24 / 38
Obsługa danych poprzez przeglądarkę zbudowanie kontrolera ruby script/generate controller admin bin/rails generate controller admin (nowsze wersje) W pliku app/controllers/admin controller.rb trzeba dopisać linijkę class AdminController < ApplicationController scaffold :product end Marcin Młotkowski Programowanie w Ruby 24 / 38
Marcin Młotkowski Programowanie w Ruby 25 / 38
Plan wykładu 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 26 / 38
Rusztowanie (scaffold) Co to jest rusztowanie wygenerowany automatycznie szkielet służący do operowania na modelu. Marcin Młotkowski Programowanie w Ruby 27 / 38
Rails wersja 2.* Można automatycznie wygenerować tabelę, model, a także kontroler z interfejsem do obsługi modelu. Marcin Młotkowski Programowanie w Ruby 28 / 38
Rails wersja 2.* Można automatycznie wygenerować tabelę, model, a także kontroler z interfejsem do obsługi modelu. Przykład $ ruby script/generate scaffold Wyklady title:string opis:text punkty:integer Marcin Młotkowski Programowanie w Ruby 28 / 38
Wynik działania skryptu Przykład $ ruby script/generate scaffold Wyklady title:string opis:text punkty:integer Marcin Młotkowski Programowanie w Ruby 29 / 38
Wynik działania skryptu Przykład $ ruby script/generate scaffold Wyklady title:string opis:text punkty:integer Migracja Powstaje plik migracji, konieczne jest $ rake db:migrate Marcin Młotkowski Programowanie w Ruby 29 / 38
Wynik działania skryptu Przykład $ ruby script/generate scaffold Wyklady title:string opis:text punkty:integer Migracja Powstaje plik migracji, konieczne jest $ rake db:migrate Kontroler z obsługą dodawania, usuwania i edycji danych modelu (CRUD) i odpowiednimi widokami Marcin Młotkowski Programowanie w Ruby 29 / 38
Wynik działania skryptu Przykład $ ruby script/generate scaffold Wyklady title:string opis:text punkty:integer Migracja Powstaje plik migracji, konieczne jest $ rake db:migrate Kontroler z obsługą dodawania, usuwania i edycji danych modelu (CRUD) i odpowiednimi widokami I jeszcze parę innych rzeczy Marcin Młotkowski Programowanie w Ruby 29 / 38
Plan wykładu 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 30 / 38
Model przypomnienie Modele to podklasy klasy ActiveRecord::Base Każda taka klasa odpowiada tabeli w relacyjnej bazie danych Obiekty tych klas odpowiadają wierszom tych tabel Metody w tych klasach ukrywają szczegóły związane z SQL i bazą danych Marcin Młotkowski Programowanie w Ruby 31 / 38
Podstawowe operacje na danych Wyszukiwanie, modyfikacja i tworzenie nowych obiektów Kontrola poprawności danych - walidacja Marcin Młotkowski Programowanie w Ruby 32 / 38
Walidacja warunki wbudowane Funkcje standardowe validates presence of :nazwa, :cena validates numericality of :cena, :message => Cena nie jest liczbą, :if => test() validates uniqueness of :nazwa Marcin Młotkowski Programowanie w Ruby 33 / 38
Zastosowanie app/models/wyklady.rb: class Wyklady < ActiveRecord::Base validates_uniqueness_of :title end Marcin Młotkowski Programowanie w Ruby 34 / 38
Walidacja własna Metoda w klasie modelu: class Wyklady < ActiveRecord::Base protected def validate errors.add(:cena, cena powinna być dodatnia ) if cena.nil? cena < 0.01 end end Marcin Młotkowski Programowanie w Ruby 35 / 38
Plan wykładu 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 36 / 38