Mostrando entradas con la etiqueta rails. Mostrar todas las entradas
Mostrando entradas con la etiqueta rails. Mostrar todas las entradas

domingo, 9 de noviembre de 2008

Ruby y creando conjunto de objetos que no están mapeados en Base de Datos

Tendré una clase Person que tendrá Contactos.

class Contacto
#esto es el constructor
def initialize (params = {})
end
end


class Person < ActiveRecord::Base

attr_accessor :lista #ya te genera getter y setter... te crean el @lista , person.lista y person.lista=
#attr_reader :lista #así te haría el get ... person.lista
#attr_writer :lista #así te haría el set ... person.lista=
#@lista = [] #es un atributo vacío, entonces tendría que declarar un getter y un setter


validates_presence_of :name, :message => 'No puede estar en blanco'

has_many :phones


#esto es el constructor de persona
def initialize (parametros = {})
#debo borrar contactos para poder llamar luego al constructor de la clase base
@lista = parametros.delete[:contactos] #al borrar, te devuelve los valores
super parametros # llamada al constructor de la clase base
end




end

sábado, 8 de noviembre de 2008

BBDD en Ruby

Relación 1 a muchos

Pongamos que tenemos una persona que tiene muchos teléfonos

# una migración para crear una persona con su nombre

class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.column :name, :string
end
end

def self.down
drop_table :people
end
end

#una migración para indicar que existe la tabla teléfono y que una persona tiene muchos teléfonos.


class CreatePhones < ActiveRecord::Migration
def self.up
create_table :phones do |t|
t.column :number, :string
t.column :perdon_id, :integer
end
end

def self.down
drop_table :phones
end
end


#### ahora en los modelos
class Person < ActiveRecord::Base

has_many :phones # una persona tiene muchos teléfonos :phones
# has_many :telefonos, :class_name => "Phone"
# has_one :phone #una persona tiene un teléfono ...el nombre de :phone es el nombre del modelo
end

class Phone < ActiveRecord::Base
belongs_to :person #un teléfono pertenece a una persona.
end


Nota
.-Donde tienes un has_one o un has_many, del otro lado hay un belongs_to
.-Si la relación es de muchos a muchos, ponemos en los dos modelos el has_and_belongs_to_many (en plural)
.-Cuando es de muchos a muchos, tienes que crear una tabla en bbdd cuya convención sea tabla1_tabla2, donde están ordenadas alfabéticamente. Ejemplo: people_phones y luego es person_id, phone_id
.-Cuando hablamos de relaciones en ruby on rails, se tratan en arrays

Breve resumen proyecto en Ruby on Rails

Estaba haciendo unas pruebas en ruby on rails, y creando mi primer proyecto con el Aptana.

Enlace de interés: Api de Ruby On Rails http://api.rubyonrails.org/

...............

Carpetas

Proyecto -> config -> database.yml es donde están las configuraciones
Proyecto -> config -> enviroment.rb están una pluralizaciones en castellano.

NombreProyecto_nombreentorno

en vendor irán los plugins para el proyecto: ejemplo, calendarios para javascript, para subir imágenes.... Un plugin es como un mini-proyecto, porque vuelve luego a repetir la estructura base de un proyecto normal.
En plugins, irían por ejemplo miniaplicaciones, como encuestas, gestión de menús,...

la carpeta app, es el grueso de la caballería, en realidad es donde está la estructura del modelo vista controlador.


controllers: la base de los controladores es application.rb


helpers: los helper son para escribir código html, ejemplo para construir un enlace parametrizados, son usadas en las vistas.
Dentro del fichero application_helper.rb haces métodos, es común a todas las vistas de la aplicación.

models: tendremos los modelos de la lógica de negocio
views: las vistas de cada controlador
Dentro de layouts, estarán las disposiciones de las vistas. Tiene los elementos, ejemplo, menús.


En aptana, en show view, hay generator, es para scaffold:
Parameter: person (es el nombre del modelo=clase).
Generator: model


Bases de Datos


db -> migrate
ahí están los ficheros de migración, es decir, de "actualizaciones" en la bbdd

def self.up
create_table :people do |t|
t.column :name, :string //es el nombre de la columna, y luego el tipo de la columna
end //del do
end //en del def

para migrar la bbdd:
en aptana: una view que se llama Rake Tasks
Task: db:migrate , si no le pasas ningún parámetro, le dices la versión a la que está y va hacia adelante.
VERSION=6 iría a la migración 6 y de ahí hacia adelante
Las migraciones se ejecutan consecutivas, si te falta una, lo ignora.
Entonces, con la 1ra migración se crea también la tabla schema_info que almacena el número de la migración en la que está.


Scaffold:

En el aptana View->Generator
Generator: Scaffold
Parameters: selecciono nombre del modelo
Va a buscar en bbdd, la tabla asociada a person, es decir, busca el plural de person (people). El controlador es de people también, es decir, en plural.

Salvo que digamos lo contrario el controlador people, usará el layout people.rhtml (que está en views-> layouts) y la carpeta people que estaría a people

En un controller, dentro de un def
render :layout=>principal //busca otro layout
render :action=>show //busca otra vista

Las variables con arroba, se ven desde la vista, y es local al método.
Si lleva dos arrobas, sería global a PeopleController