Ruby on Rails Fullstack

Banco de Dados

SQLite

  • Um pequeno banco de dados
  • Rápido, mas simples
  • Bom para demos, não muito para aplicações reais
# Mac
$ brew install sqlite

# Linux
$ sudo apt-get install sqlite libsqlite3-dev

Para instalar

SQLite no Terminal (Create)

-- inicia o SQLite no terminal e armazena tudo num arquivo db.sqlite
$ sqlite3 db.sqlite 

---------------------------------------------------------------------

CREATE TABLE 'cart' (
    id    INTEGER PRIMARY KEY AUTOINCREMENT,
    owner VARCHAR,
    total FLOAT
);

CREATE TABLE 'product' (
    id    INTEGER PRIMARY KEY AUTOINCREMENT,
    desc  VARCHAR,
    price FLOAT
);

CREATE TABLE 'cart_item' (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    cart_id       INTEGER FOREING KEY REFERENCES cart(id),
    product_id    INTEGER FOREING KEY REFERENCES product(id),
    qty           INTEGER
);

SQLite no Terminal (Insert)

INSERT INTO 'cart' (owner) VALUES ('Jon Snow');
INSERT INTO 'cart' (owner) VALUES ('Cersei');

INSERT INTO 'product' (desc, price) VALUES ('dragon glass', 20.0);
INSERT INTO 'product' (desc, price) VALUES ('elephants', 250.30);
INSERT INTO 'product' (desc, price) VALUES ('wine', 0.50);

INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (1, 1, 100);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (2, 2, 20);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (1, 3, 200);
INSERT INTO 'cart_item' (cart_id, product_id, qty) VALUES (2, 3, 700);

SQLite no Terminal (Read)

-- for better visualization
.headers on
.mode column

SELECT * FROM 'cart';        -- seleciona tudo da tabela 'cart'
SELECT * FROM 'product';     -- seleciona tudo da tabela 'product'

-- Pega o nome do owner (em cart), 
-- o nome do produto e o preço (em product)
-- e a quantidade de cada item (em cart_item)
SELECT cart.owner, product.desc, product.price, cart_item.qty FROM 'cart_item'    
    JOIN 'product' ON product.id = cart_item.product_id
    JOIN 'cart' ON cart.id = cart_item.cart_id
    WHERE cart.id = 1;

SQLite no Terminal (Update)

UPDATE 'product' SET price = 1 WHERE desc = 'wine';
UPDATE 'cart' SET owner = 'Tyrion' WHERE id = 1;
UPDATE 'cart_item' SET cart_id = 1 WHERE product_id = 3;
UPDATE 'product' SET price = 1000; -- Oh oh...

SQLite no Terminal (Delete)

DELETE FROM 'product' WHERE desc = 'elephants';
DELETE FROM 'cart' WHERE id = 2;
UPDATE 'cart_item'; -- Oh oh...

SQLite no Terminal (Homework)

  • As tais das constraints
  • on update / on delete
  • 1:1, 1:N, N:N

Banco de Dados em Ruby

Vamos criar um projeto!

  • lib
    • app.rb
    • models (um modelo por tabela)
      • cart.rb
      • product.rb
      • cart_item.rb
    • db
  • spec
  • Rakefile (copie da Aula 01)

Modelos / Tabelas

# cada tabela de nosso BD será uma Classe em ruby. Exemplo

# lib/models/cart.rb
class Cart
    attr_reader :id, :total
    attr_accessor :owner

    def initialize(attributes = {})
        @id = attributes[:id]
        @owner = attributes[:owner]
        @total = attributes[:total]
    end
end

Inicializando o BD em ruby

# lib/app.rb

require 'sqlite3' # precisamos disso para usar os comandos SQLite

# vamos importar os arquivos de nossas classes para usarmos aqui
require_relative 'models/cart'
require_relative 'models/product'
require_relative 'models/cart_item'

# inicializamos a constante que irá referenciar nosso BD
# passando o caminho do arquivo onde o mesmo se encontra (relativo
# ao arquivo app.rb
db_path = File.join(File.dirname(__FILE__), "db/shopping.sqlite")
DB = SQLite3::Database.new(db_path)

# Podemos realizar várias consultas dessa maneira
DB.execute("INSERT INTO 'cart' (owner) VALUES ('Cersei')")

# Se tivermos um modelo...
cart = Cart.new(owner: 'Jon Snow')

# ...Podemos interpolá-lo!
DB.execute("INSERT INTO 'cart' (owner) VALUES ('#{cart.owner}')")

Recuperando informações

# lib/app.rb

# ...

rows = DB.execute("SELECT desc, price FROM product")
# => [
#     ["dragon glass", 20.0],
#     ["elephants", 250.3],
#     ["wine", 0.5]
#    ]

# Se quisermos mostrar os resultados em hashes
DB.results_as_hash = true
rows = DB.execute("SELECT desc, price FROM product")
# => [
#     {"desc"=>"dragon glass", "price"=>20.0},
#     {"desc"=>"elephants", "price"=>250.3},
#     {"desc"=>"wine", "price"=>0.5}
#    ]

AC - Ruby On Rails - Aula 04 - parte 1

By Rafael Pereira Alonso

AC - Ruby On Rails - Aula 04 - parte 1

Quarta Aula (parte 1) da Atividade Complementar de Ruby On Rails, lecionada na Universidade Federal de São Carlos, campus Sorocaba, no primeiro semestre de 2019

  • 52