Ayuda con relaciones!

Saludos a la comunidad…

La pregunta de hoy es la siguiente tengo 2 tablas ciudades y estado
que están formada de la siguiente manera:
ciudades: (id serial NOT NULL, nomciudad text, estado_id integer)
estados: (id serial NOT NULL, nomestado text)

mi modelo quedaron de la siguiente manera:
(ciudade.rb)
class Ciudade < ActiveRecord::Base
belongs_to :estado
end

(estado.rb)
class Estado < ActiveRecord::Base
has_many :ciudade
end

Estoy intentado de estudiar todo a fondo, para ver que es todo, lo que
estoy leyendo, quiero hacer un ejemplo en consola para ver si todo me
esta funcionando y obtengo el siguiente error.

Esto es lo que hago en consola:

class Ciudade < ActiveRecord::Base
belongs_to :estado
end
=> nil

ciudade = Ciudade.find_by_sql(“Select estado.nomestado as
estadonomestado from ciudade inner join estado on ciudade.estado_id =
estado.estado_id”)

y el erro es:
ActiveRecord::StatementInvalid: PGError: ERROR: no existe la relación
“ciudade”

alguien me puede ayudar con el erro o me puede orientar… Gracias de
antemano…

Hola Juan, cuando creas una relacion del tipo :has_many, esta tiene que
ir
en plural para que Rails pueda inferir la clase asociada
automaticamente,
osea quedaria asi:

class Estado < ActiveRecord::Base
has_many :ciudades
end

Por cierto, para mi seria mucho mejor modificar aqui el inflector que
ponerle nombres raros a tus clases, aunque personalmente para los
nombres de
mis clases uso el ingles y me evito de lios, pero si quieres usar
español,
aqui una chuleta:

http://wryanez.blogspot.com/2007/09/rails-haciendo-que-rails-pluralice-en.html

Dicho codigo lo pones en un
inicializador(config/initializers/inflection.rb)
y debe andar bien.

Otro consejo: usa find_by_sql cuando sea exclusivamente necesario, no
hagas
quedar mal a Rails :wink:

Saludos.

Por cierto, para mi seria mucho mejor modificar aqui el inflector que
ponerle nombres raros a tus clases, aunque personalmente para los
nombres de
mis clases uso el ingles

Una pregunta amigo Ruben si por ejemplo hago mis clases en ingles
quedarían de esta forma?

cities: (id serial NOT NULL, nomciudad text, state_id integer)
states: (id serial NOT NULL, nomestado text)

mi modelo quedaron de la siguiente manera:
(city.rb)
class City < ActiveRecord::Base
belongs_to : state
end

(state.rb)
class State < ActiveRecord::Base
has_many :city
end

2008/9/16 Juan M. [email protected]

mi modelo quedaron de la siguiente manera:
(city.rb)
class City < ActiveRecord::Base
belongs_to : state
end

(state.rb)
class State < ActiveRecord::Base
has_many :city
end

Sería:

(state.rb)
class State < ActiveRecord::Base
has_many :cities
end

Sería:

(state.rb)
class State < ActiveRecord::Base
has_many :cities
end

Ok ya las cosas me están saliendo bien, solo me queda esta pregunta,
estoy tratando de hacer en consola este ejemplo:

require ‘rubygems’
=> []

require ‘activerecord’

=> true

ActiveRecord::Base.establish_connection(:adapter=>‘postgresql’,:host=>‘localhost’,:port=>‘5432’,:username=>‘yo’,:password=>‘xxxx’,:database=>‘xxxx’);

?> class State < ActiveRecord::Base

has_many :cities

end

estado = State.find(2)

=> #<State id: 2, nomestado: “Lara”>

estado.cities each do |city|

?> print city.nomciudad + “,”

end

y obtengo el siguiente error: NameError: undefined local variable or
method ‘each’ for main:Object

Alguna ayuda!!! :slight_smile:

On Wed, Sep 17, 2008 at 11:28 AM, Juan M.
[email protected] wrote:

each es un método :
estado.cities.each do |city|
print city.nomciudad + “,”
end

Saludos


¡Falta Uno! - http://www.falta-uno.com.ar/
Ricardo M.

Veo que estas haciendo el require de rubygems y activerecord, porque? Si
desde el root de tu aplicacion rails ejecutas ruby script/console ya
tienes
todo el enviroment de tu aplicacion por lo que no tienes que hacer
ningun
require.

Gracias a todos ya todo me funciona bien y ya estoy entendiendo bien las
relaciones Ruby es lo MAXIMO!!! amigo Juan P. para responder tu
pregunta lo hago lo hago solo por costumbre para forzarme a escribir mas
los comandos y así me los aprendo solo por eso… :slight_smile:

El problema esta en el modelo Alumno
class Alumno < ActiveRecord::Base
has_one :cities
end

Debria ser: has_one :city porque el usuario pertenece solo a una
ciudad.

2008/9/18 Juan M. [email protected]

Nuevamente estoy por estos lados…
Tengo nuevamente una pregunta, tengo las siguientes tablas las cuales ya
me han ayudado, pero ahora me pasa esto:

TABLE alumnos(id, nombre, telefono,correo, direccion,
cedula,apellido,genero, usuario, fnacimiento, clave, citie_id)

TABLE cities(id,nomciudad,state_id)

model
(alumno.rb)
class Alumno < ActiveRecord::Base
has_one :cities
end

(city.rb)
class City < ActiveRecord::Base
belongs_to :state
end

(state.rb)
class State < ActiveRecord::Base
has_many :cities
end

Ejemplo si yo hago la siguiente instrucción

alumno= Alumno.find(200)

=> #<Alumno id: 200, nombre: “”, telefono: “041”, correo: “”, direccion:
“ddddd”, cedula: “12”, apellido: “”, genero: "masculino ", usuario: “”,
fnacimiento: nil, clave: “”, citie_id: 12>

alumno.city.nomciudad
Me da este error:
NoMethodError: undefined method `nomciudad’ for nil:NilClass

Ayer entendi todo lo que estaba haciendo pero ahora que hago este nuevo
ejemplo me confundo nuevamente!! Si alguien nuevamente me ayuda gracias
de antemano!!

PD: estoy leyendo el libro Pro Active Record voy lento pero estoy en
eso!! yo estoy sacando mis ejemplos tal cual lo hace el libro…

Juan P. wrote:

El problema esta en el modelo Alumno
class Alumno < ActiveRecord::Base
has_one :cities
end

Debria ser: has_one :city porque el usuario pertenece solo a una
ciudad.

Amigo gracias pero de verdad no se si es porque estoy enfermo o que!!
pero cometí una burrada!!! Disculpen!!! :wink:

Me sale dormir…