seven_palestra_banco_dados_servidores

Post on 14-Nov-2014

615 Views

Category:

Education

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Palestra sobre banco de dados e servidores na Seven

TRANSCRIPT

Banco de Dados

Cleber @ Tavares Junior .com

D6, em homenagem ao Felipe Simões e ao Mairon Luz ;-)

... E ao Paulo Store o/

Banco de Dados

Cleber @ Tavares Junior .com

O que são?

Em informática, resumidamente, são coleções de informações armazenadas, que relacionadas dão valor de negócio à um sistema / empresa.

(Traduzindo em jogos: são o login do jogador e sua senha, seus pontos e níveis de personagem, seu equipamento e suas informaçõe$ de crédito)

Dito isto, nós NÃO vamos falar sobre banco de dados...

... apenas.

Banco de Dados

Cleber @ Tavares Junior .com

Vamos tentar mostrar toda a estrutura que envolve um Banco de Dados e seu desenvolvimento.

KISS: Keep It Simple, Student.

Mas existem muito mais coisas escondidas entre seu servidor nas nuvens e seu cliente / jogo no seu computador, Student...

Banco de Dados

Cleber @ Tavares Junior .com

Primeiro, retomando nossa definição de Banco de Dados, nos primeiríssimos sistemas informatizados (antes da década de 70), estas informações eram guardadas no próprio sistema de arquivos do S.O.

E isso gerava uma série de problemas...

A partir daí surgiram os SGBD – Sistemas Gerenciadores de Banco de Dados. Na década de 80 surgiram os SGBD relacionais, que estão em domínio até hoje. Ou seja, tabelas. (MySQL, SQLite, PostgreSQL, Oracle$)

Em tempos recentes vem surgindo com cada vez mais força os SGBD Orientados à Objetos, ou não-relacionais, com o movimento NoSQL (já vamos falar do SQL), como os MongoDB, CouchDB, e os da Google e Amazon

Banco de Dados

Cleber @ Tavares Junior .com

Em suma, existem várias tecnologias de bancos de dados, cada uma com uma característica própria (simples e pequenos, simples, simples e escalável, robustos e caros), alguns gratuitos, outros pagos por diversos valores... O profissional que deseja trabalhar com isso precisa saber avaliar.

Para lidar com todas estas diferenças, nos bancos de dados relacionais, foi criada uma linguagem padrão para manipulação das tabelas, a SQL (Structured Query Language, Linguagem de Consulta Estruturada), pela IBM no início dos anos 70.

Esta linguagem, assim como todas as outras linguagens de computador, evolui (estamos no SQL:2003). Infelizmente nem todos os SGBD seguem o padrão da linguagem à risca.

Isto é uma típica representação esquemática de um SGBD:

Banco de Dados

Cleber @ Tavares Junior .com

E a seguir uma breve apresentação da linguagem SQL. Ela serve para criar as tabelas, as colunas / campos, inserir os dados, fazer a busca e o relacionamento entre eles:

Banco de Dados

Cleber @ Tavares Junior .com

SQL, resumo / palavras - chave

Comandos de Criação (DDL)

Comandos de Controle (DCL)

Comandos de Transação (DTL)

CREATE TABLE GRANT ROLLBACK

ALTER INDEX REVOKE

DROP VIEW

Banco de Dados

Cleber @ Tavares Junior .com

SQL, resumo / palavras - chave

Comandos de Manipulação (DML)

Comandos de Consulta (DQL)

INSERT SELECT

SELECT

UPDATE

DELETE

CRUD!

Banco de Dados

Cleber @ Tavares Junior .com

O comando de consulta SELECT é o mais utilizado, nele temos as cláusulas:

FROM, WHERE, HAVING, GROUP BY, ORDER BY, DISTINCT, JOIN

Os operadores lógicos:

AND, OR, NOT

Os operadores relacionais (muitas características do SQL foram baseadas na álgebra relacional):

<, >, <=, >=., =, <>, BETWEEN, LIKE, IN

As funções de agregação:

AVG, COUNT, SUM, MAX, MIN

Banco de Dados

Cleber @ Tavares Junior .com

Pequenos exemplos de comandos SQL:

CREATE TABLE Players(

id INT NOT NULL AUTO_INCREMENT, name VARCHAR (60) NOT NULL, birth DATE, phone CHAR (8), PRIMARY KEY (id)

)

Players

id name birth phone

Banco de Dados

Cleber @ Tavares Junior .com

Pequenos exemplos de comandos SQL:

INSERT INTO Players VALUES (1, ‘Clever Tavares Jr.', 1900-08-19,’’);

Players

id name birth phone

1 Clever Tavares Jr. 1900-08-19

Banco de Dados

Cleber @ Tavares Junior .com

Pequenos exemplos de comandos SQL:

INSERT INTO Players VALUES (3, ‘', 19/08/1900,26667070);

Precisamos de uma maneira de assegurar que valores inválidos não sejam inseridos! Nossos dados tem que ser consistentes!

Players

id name birth phone

1 Clever Tavares Jr. 1900-08-19

3 19/08/1900 26667070

Banco de Dados

Cleber @ Tavares Junior .com

Pequenos exemplos de comandos SQL:

SELECT * FROM Players;

SELECT name AS Nick FROM Player;

Players

id name birth phone

1 Clever Tavares Jr. 1900-08-19

Players

Nick

Clever Tavares Jr.

Banco de Dados

Cleber @ Tavares Junior .com

Pequenos exemplos de comandos SQL:

SELECT name, birth FROM Players WHERE name LIKE ‘Cleber‘;

SELECT TOP 5 name, value FROM Points ORDER BY value desc; /*;-)*/

Chega!

Players

name birth

Banco de Dados

Cleber @ Tavares Junior .com

Mas não temos apenas nosso banco de dados no processo. Para este ser acessado remotamente, via web, precisamos de uma tecnologia de servidor, alguma aplicação / serviço que fique online o tempo todo provendo esta comunicação.

Importante, esta aplicação ou programa, que nós desenvolvemos com linguagens de servidor como C# / Java / PHP / Python / Ruby, deve ser criada seguindo o esquema de implementação MVC, Model-View-Controller, Modelo(Banco)-Visualização(Página, Cliente)-Controlador(Acesso), ou seja, mantendo sua lógica de implementação independente da camada de visualização e dos dados.

A “camada de visualização”, pode ser uma página no navegador do jogador, ou um jogo em Flash no navegador do jogador, ou um jogo no computador do jogador. É ali no cliente que alguns dados devem ser tratados, com tecnologias / linguagens de cliente (html –eu sei-, css, javascript, em Flash, em Unity…), e outros devem vir/ir do/para o servidor, mantendo sempre o balanceamento adequado.

Banco de Dados

Cleber @ Tavares Junior .com

Nosso esquema fica assim:

Banco de Dados

Cleber @ Tavares Junior .com

Claro que eu posso ter vários clientes:

Banco de Dados

Cleber @ Tavares Junior .com

Estes clientes podem gerar uma carga / volume de acesso muito grande de tal modo que eu precise fazer o balanceamento / distribuição entre vários servidores

Banco de Dados

Cleber @ Tavares Junior .com

Normalmente a base de dados é compartilhada, mas às vezes não! E é preciso ter muito cuidado para manter os dados coesos / coerentes / sincronizados!

Banco de Dados

Cleber @ Tavares Junior .com

E às vezes, as máquinas / computadores que são responsáveis pela aplicação servidora e os SGBD´s nem são as mesmas, ou estão no mesmo lugar físico, e sim espalhadas pelo mundo onde for mais conveniente.

É o conceito “nas nuvens”. Que auxilia na escabilidade do projeto / jogo.

Banco de Dados

Cleber @ Tavares Junior .com

Tá, então quais tecnologias vamos escolher para nosso exemplo?

1- Um computador rodando Windows 7 comum. ATENÇÃO! A grande maioria dos servidores é Linux, e boa parte das linguagens de servidor pode ser usada tanto em um quanto no outro (Java, PHP, Python, Ruby, MySQL…)

2- O banco de dados MySQL, que é fácil de instalar, configurar e rodar no Windows e é bastante suportado, tendo uma interface gráfica facilitadora.

3- A linguagem de programação Ruby e o framework de aplicações web Ruby On Rails, ambos compatíveis com Windows e Linux. Existem muitas páginas famosas que usam Rails, sendo este bastante famoso (Twitter…) e ele tem uma forte comunidade. Apesar de não ser muito fácil usar em Windows, pode facilitar o desenvolvimento com scaffold… e é diferente ;-)

Vamos lá detalhar isso:

Banco de Dados

Cleber @ Tavares Junior .com

1- Sobre o sistema operacional, vale ressaltar aqui que uma vez que você desenvolva no Windows, o processo de *deploy*, ou colocar em produção / funcionamento em um servidor com Linux, pode ser trabalhoso. Mas os servidores Linux são mais baratos (e robustos e seguros…). Fica o aviso. Não veremos isso aqui hoje.

Banco de Dados

Cleber @ Tavares Junior .com

2- Banco de dados MySQL;

http://www.mysql.com/downloads/mysql/

Gratuito na versão Community, com código fonte se quiser, 30 megas.

Esta é a versão mais nova.

Você pode experimentarversões mais antigas(5.0 e 5.1) se tiverproblemas de compatibilidade

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Podemos testar como acima para saber se tudo está ok.Podemos fazer tudo via linha de comando (cmd).Mas também podemos ter um editor visual para ajudar.Aí entra o SQLyog:

http://www.webyog.com/en/http://code.google.com/p/sqlyog/downloads/list

Vamos fazer o download da versão Community gratuita e instalar.

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Temos agora o banco de dados MySQL funcionando com um editor visual no Windows, vamos ao próximo passo:

3- A linguagem de programação Ruby e o framework de aplicações web Ruby On Rails, ambos compatíveis com Windows e Linux e também tendo vários editores.

http://rubyinstaller.org/

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Não esquecer de na mesma página baixar o Ruby Development Kit, que permitirá instalar extensões nativas como o mysql2!

Assim que terminar o download, você deverá extrair os arquivos para o diretório / pasta C:\ruby193\devkit, que não existe e precisa ser criado.

Agora, volte ao terminal. Você precisará instalar o DevKit na instalação atual do Ruby. Para isso, digite os comandos:

 cd C:\Ruby193\devkit para ir ao diretório que você acabou de extrair. Execute os comandos:

ruby dk.rb init e depois ruby dk.rb install

Banco de Dados

Cleber @ Tavares Junior .com

Não acabou :-/ Nós ainda precisamos configurar o Ruby para suporte ao MySQL.

Para fazer isso, acesse a página de downloads do MySQL e clique no link MySQL Connectors. Precisaremos da versão "Connector/C (libmysql)". Na página de download, escolha a opção sem o instalador. Escolha a versão de 32-bits. Isso é necessário porque o Ruby é 32-bits e, mesmo que a instalação do MySQL tenha sido feita em 64-bits, o conector que será usado por ele deve ter a mesma arquitetura. Extraia os arquivos e copie o arquivo mysql-connector-c-noinstall-6.0.2-win32/lib/libmysql.dll para o diretório C:\Ruby193\bin. Isso é necessário pois DLLs precisam estar no PATH do Windows e, o diretório bin do Ruby no Windows está lá.

Banco de Dados

Cleber @ Tavares Junior .com

http://www.mysql.com/downloads/connector/

Banco de Dados

Cleber @ Tavares Junior .com

ATENÇÃO! Os passos acima são os mais problemáticos. Se não conseguir rodar seu servidor, veja solução mais abaixo.

Banco de Dados

Cleber @ Tavares Junior .com

Lembrando que:

“Nada é totalmente fácil ou difícil, esta é a beleza do mundo. Cabe à pessoa julgar as ferramentas para alcançar seus objetivos.”

A linguagem Ruby junto com o framework para desenvolvimento web Rails tem suas vantagens em relação ao PHP, incluindo um modelo de MVC (já discutido) embutido.

Com o até aqui feito, temos esta nova linguagem em nossa máquina habilitada para trabalhar com MySQL. Mas a linguagem não é tudo. Assim como em C# eu tenho o framework (conjunto de classes) XNA para me facilitar o desenvolvimento de jogos, em AS3 eu tenho a library / biblioteca Box2D para física, em ambiente Mobile / Java eu tenho uma série de frameworks (AndEngine, Cactus2D, XNAndroid) para jogos, ou posso usar a engine (grande conjunto de ferramentas) Unity em C# ou Boo, eu preciso de um framework para direcionar meu aplicativo / ranking na web.

Este framework se chama Ruby On Rails (Ruby nos trilhos). Vamos instalá-lo.

Banco de Dados

Cleber @ Tavares Junior .com

O comando acima instala as classes sem a documentação, que é demorada…

Banco de Dados

Cleber @ Tavares Junior .com

Aproveitando que estamos falando sobre isso tudo, não poderia deixar de chamar a atenção para se verificar se está instalado na máquina também um sistema de controle de versão. Isto é importantíssimo em qualquer desenvolvimento de sistemas ou jogos. Sugiro o TortoiseSVN, e aos mais corajosos o Git, que já tem versão estável para Windows. (TortoiseGIT…) Mas foge ao escopo deste trabalho falar sobre isso agora.Vamos atualizar coisas que o rails precisa para criar uma app (bundle…):

gem updategem install rake –v 0.9.2.2gem install coffee-script-source -v 1.3.3gem install execjs -v 1.4.0gem install coffee-script -v 2.2.0gem install coffee-rails -v 3.2.2gem install jquery-rails -v 2.0.2gem install mysql2 -v 0.3.11gem install sass –v 3.1.20gem install sass-rails -v 3.2.5gem install uglifier -v 1.2.6

Banco de Dados

Cleber @ Tavares Junior .com

Alternativa para tanta atualização: http://railsftw.bryanbibat.net/

MUITO BOM!!!

Banco de Dados

Cleber @ Tavares Junior .com

Agora podemos dar o comando para criar nossa aplicação / app rails:

Rails new teste –d mysql

Com este comando (que deve ser dado em um diretório adequado) criamos um subdiretório chamado teste, onde se cria toda a estrutura (quq já vamos ver) do Rails, usando um banco de dados mysql (sqlite é o padrão)

Mas espere! E para editar os arquivos? Vamos ficar na linha de comando o tempo todo? Não… Existem muitos editores (a.k.a. Flash IDE, Flash Develop, Visual Studio, Eclipse, Mono Develop) que você pode usar para Rails, que reconhecem a sintaxe do Ruby, desde gratuitos até pagos de diversos valores. Sugestões temos o Notepad++, Redcar, Scite, gEdit… o próprio Eclipse…

Mas vamos ficar de NetBeans. Mesmo com os problemas dele… (peso e obsolência)

Banco de Dados

Cleber @ Tavares Junior .com

http://netbeans.org/downloads/6.9.1

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Veja como o Rails organiza nossos arquivos (lembrando esta pasta foi importada, nenhum arquivo

foi criado pelo NetBeans)

Lembra do conceito de MVC para melhorar nossa lógica do servidor? Model-View-Controller?

Repare que temos uma pasta de Models (para os modelos que

representam justo a base de dados)Uma pasta de Views, para as visualizações/layoutsE uma pasta de Controllers/lógica

Além disso uma pasta com Helpers/Auxiliares, um enviador de email, Confidurações, pasta Pública, Logs de servidor, arquivos de teste e documentação (Rails te orienta a fazer os testes de lógica de servidor!), bibliotecas e… migrations!

Banco de Dados

Cleber @ Tavares Junior .com

As migrations tem a ver com nosso banco de dados, são as mudanças nele ao longo do desenvolvimento de nossa aplicação. Pense na importância disso. Se seu banco de dados não corresponder à lógica da sua aplicação (controllers / views), você corre o risco de tentar exibir algo que não existe (erro na certa) ou de guardar informações desnecessárias (desperdício). Coerência.

“Uma página é uma exibição de um banco de dados”, controverso… especialmente em jogos.

As migrations e o models nos “protegem” de ter que lidar com a linguagem SQL diretamente…

Vamos gerar no nosso banco / página as informações anteriores de Player (o inglês é quase necessário para programar web / sistemas / rails / páginas…)

Banco de Dados

Cleber @ Tavares Junior .com

rails generate scaffold Player name:string birth:date phone:string

Banco de Dados

Cleber @ Tavares Junior .com

Scaffold = arcabouço = migration (mudança no BD) + Model (representação do BD no servidor) + Controller (fluxo de telas) + View (exibição), tudo junto.

Vamos colocar nossa aplicação nesta versão: Migrar o Banco de Dados

Opa, fomos negados! Que houve? Não conseguimos acesso aoBanco de Dados. Vamos editar nosso arquivo de configuração no NetBeans.

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Este é nosso arquivo de configuração do acesso do servidor na base de dados, toda tecnologia de servidor tem essa configuração. Repare que Rails nos dá automaticamente 3 tabelas (que devem ser criadas), chamadas por padrão de nome_development, nome_teste, nome_production, com configurações separadas para cada uma. Tudo para orientar o bom desenvolvimento!

Vamos configurar a tabela de desenvolvimento:

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Uma vez com isso salvo vamos rodar nossa migração:

Ok. Vamos rodar nosso servidor e ver isso?

Como assim rodar o servidor? Ah, não contei? Quando você faz o código, precisa de algo para executá-lo. Um Apache Server da vida, vai ler seu código e atender às requisições de página.

Sorte nossa que o Rails vem com um servidor embutido, o WEBrick, basta chamá-lo assim: (ah, e podemos depois mudar de servidor se quisermos, inclusive para Apache)

Banco de Dados

Cleber @ Tavares Junior .com

rails server

Repare que ele está “ouvindo” (atendendo requisições) em http://localhost:3000

Banco de Dados

Cleber @ Tavares Junior .com

Tcharam! Temos uma página rodando, “Hello World” (antes mesmo da migration)

Banco de Dados

Cleber @ Tavares Junior .com

E olhando direto no SQLyog nossa base de dados, vemos que ela já está com a tabela correta (lembre, um comando para gerar os arquivos e outro para migrar)

Banco de Dados

Cleber @ Tavares Junior .com

Se olharmos no NetBeans nossas pastas e arquivos, vemos que temos já controllers e views para Player:

Banco de Dados

Cleber @ Tavares Junior .com

Lembrando que os controllers direcionam o fluxo de nossa aplicação, ou seja, que página mostrar. Sabe uma página “index”? Pois é, olha lá o método de resposta à ela ali…

E começamos aqui a ver um pouco mais de perto a linguagem Ruby. Não é tão difícil, é? AS funções/métodos são defs, com end no final (parece Basic). O @players é um conjunto de players… sim, instâncias de uma classe.

Conhece o RPG Maker? Sabe sua linguagem de programação? RGSS? Ruby Game Script System! Isso aí! São a mesma.

Banco de Dados

Cleber @ Tavares Junior .com

Repare que eu estou na verdade mapeando um método de acesso à página do próprio protocolo http, o GET. O GET sem número em um controller lê todos os objeots correspondentes, o GET/numero retorna o objeto com aquele id, assim como os métodos POST, PUT e DELETE estão mapeados… isso se chama REST e é uma técnica muito eficiente.

Em Rails, não saia dos “trilhos”. Mantenha seus nomes corretos e tudo fará sentido e funcionará automaticamente. Esta é a filosofia do framework.

Vamos “olhar” a view?

Banco de Dados

Cleber @ Tavares Junior .com

Repare como funciona bem como uma camada de visualização, sem interferir nos dados e podendo ser mudada à vontade. Inclusive traduzida, sem mudar a base.

Banco de Dados

Cleber @ Tavares Junior .com

O que temos aqui é aquela lista de @players sendo mostrada. Repare no “for each”. Epa, peraí… eu não escrevi código nenhum, será que eu já posso ver isso? Hum…

Banco de Dados

Cleber @ Tavares Junior .com

Uau! Eu tenho uma página com uma listagem dos jogadores e um cadastro!

1- Vamos ver seu código fonte, o html?

Banco de Dados

Cleber @ Tavares Junior .com

Banco de Dados

Cleber @ Tavares Junior .com

Repare que eu tenho um código “limpo” no cliente, com a importação automática de alguns javascripts padrões (posso alterar), alguns metanames padrões (também posso alterar) e a tabela com um link para criar um novo jogador.

É assim que funciona uma tecnologia de servidor. Gera uma página ou informação dinâmica e “cospe” ela para quem pedir. (perdão pelo termo, culpa do Carlos)

Voltando ao controller, ele responde à requisições html e também… xml! Como isso? Vamos acessar a mesma coisa, uma listagem dos jogadores, mas em xml:

Banco de Dados

Cleber @ Tavares Junior .com

Repare que ele não deu erro! Apenas mostrou o XML vazio, afinal, ainda não temos jogadores. Ou recordes, ou imagens, o que seja. Mas se tivéssemos estaria ali, sem nenhum esforço! Qual a importância disso? Se tivéssemos acessando estas informações pela página, mostramos o html. Mas se tivéssemos nosso cliente em Unity ou XNA ou Flash para mostrar a lsita de jogadores, por exemplo, qual a melhor maneira de fazer isso? XML!

Banco de Dados

Cleber @ Tavares Junior .com

2- Muito bonito, mas a bagaça funciona?

Vamos tentar cadastrar um novo jogador:

Banco de Dados

Cleber @ Tavares Junior .com

2- Muito bonito, mas a bagaça funciona?

Vamos tentar cadastrar um novo jogador:

Banco de Dados

Cleber @ Tavares Junior .com

2- Muito bonito, mas a bagaça funciona?

Vamos tentar cadastrar um novo jogador:

Banco de Dados

Cleber @ Tavares Junior .com

2- Muito bonito, mas a bagaça funciona?

Vamos tentar cadastrar um novo jogador:

Definitivamente funciona.

Banco de Dados

Cleber @ Tavares Junior .com

Mostrando um pouco de testes:

Banco de Dados

Cleber @ Tavares Junior .com

Uma vez com o banco populado, como fica o xml:

Banco de Dados

Cleber @ Tavares Junior .com

De um player só:

Banco de Dados

Cleber @ Tavares Junior .com

É possível ver o dump da database

Banco de Dados

Cleber @ Tavares Junior .com

Não satisfeito com os testes e a lógica de “negócio”, quer mais facilidade para criar a aplicação?

Lembra no início que nossa tabela tinha o nome do jogador como campo obrigatório? Pois é, vamos ao model do player (nosso correspondente da tabela) resolver isso:

Estava assim:

Ficou assim:

Só isso… vamos à página…

Banco de Dados

Cleber @ Tavares Junior .com

Se eu tentasse cadastrar em branco antes poderia…

Banco de Dados

Cleber @ Tavares Junior .com

Agora não mais…

Ah, as mensagens de erro são personalizáveis.

Banco de Dados

Cleber @ Tavares Junior .com

Quais validates exitem?

validates :terms_of_service, :acceptance => truevalidates :email, :confirmation => truevalidates :email_confirmation, :presence => truevalidates :legacy_code, :format => { :with => /\A[a-zA-Z]+\z/, # expressões regulares    :message => "Only letters allowed" }validates :name, :length => { :minimum => 2 }validates :bio, :length => { :maximum => 500 }validates :password, :length => { :in => 6..20 }validates :registration_number, :length => { :is => 6 }validates :email, :uniqueness => truehas_many :posts, :dependent => :destroyhas_one :image

Banco de Dados

Cleber @ Tavares Junior .com

Rails pode trabalhar com sistemas de arquivos, anexos, o que você quiser, de forma fácil, basta usar a imagninação e a pesquisa ;-)

Usanod os validates corretos você consegue montar os relacionamentos entre os modelos, e a busca de informações.

Banco de Dados

Cleber @ Tavares Junior .com

Uma ótima dica de documentação, não apenas de Ruby ou Rails, mas de dezenas de linguagens e frameworks:

Banco de Dados

Cleber @ Tavares Junior .com

Uma ótima dica de documentação, não apenas de Ruby ou Rails, mas de dezenas de linguagens e frameworks:

top related