Re: Acceder a multiples bases de datos

Vamos a ver, he cambiado un poco la estructura de la aplicación a ver si
se puede simplificar.

Tengo el controlador “noticias” con el método “listar_noticias”. Cuando
lo ejecuto en
http://localhost/noticias/listar_noticias me muestra las noticias de la
base de datos “noticias”

Pero también tengo el controlador “admin” con el método
“list_admin_news” que quiero que me muestre las noticias de la base de
datos “admin”. Para esto tengo el siguiente código:

En application.rb:

    before_filter :set_extra_db_connection
    def set_extra_db_connection
            extra_coord = 

YAML.load(File.open(File.join(RAILS_ROOT,“config/database.yml”),“r”))[“admin”]
Admin.establish_connection(extra_coord)
end

En admin_controller.rb

class AdminController < ApplicationController
    def list_admin_news
        require_auth 'users'
        @noticias_admin = Noticia.find(:all)
    end
end

En el modelo admin.rb

class Admin < ActiveRecord::Base
    establish_connection :admin
end

El problema es que tanto noticias/listar_noticias y
admin/list_admin_news se conectan los dos a la misma base de datos
sacando asi los mismos datos. ¿Qué puedo hacer?

----- Mensaje original ----
De: congrio [email protected]
Para: La lista sobre Ruby On Rails (rubyonrails.com) en castellano
[email protected]
Enviado: lunes, 29 de enero, 2007 10:29:59
Asunto: Re: [Ror-es] Acceder a multiples bases de datos

El problema es que estoy demasiado verde en rails y no se que tendria
que hacer exactamente
para poner el codigo en lib o en ApplicationController.

Lo que si tengo en aplication controller (en controllers/application.rb)
es el siguiente codigo para conectar
a la base de datos B

    before_filter :set_extra_db_connection

    def set_extra_db_connection
            extra_coord =

YAML.load(File.open(File.join(RAILS_ROOT,“config/database.yml”),“r”))[“controladorb”]
Controladorb.establish_connection(extra_coord)
end

y el codigo del modelo de controladorb es:

class Controladorb < ActiveRecord::Base
establish_connection :controladorb
end

y en el controladora el codigo para intentar llamar a controladorb:
@noticiaexternas = Controladorb.buscar_noticia

que falla con el siguiente error:
undefined method `buscar_noticia’
for Controladorb:Class

Lo que busco es poder acceder a la vez a dos bases de datos desde un
mismo controlador

----- Mensaje original ----
De: Imobach González Sosa [email protected]
Para: [email protected]
Enviado: lunes, 29 de enero, 2007 9:58:17
Asunto: Re: [Ror-es] Acceder a multiples bases de datos

El Monday 29 January 2007 08:51:23 congrio escribió:

Sigo atrancado con esto.

Ahora, en mi aplicación si pongo
http://localhost/controlador_b/buscar_noticia funciona perfectamente
Entonces, es cuando quiero que el buscar_noticia sea ejecutado desde
el
controlador_a ejecuto http://localhost/controlador_a/listar_noticia y me
dice:

undefined method `buscar_noticia’ for Controlador_b:Class

el código que falla es:

@noticias = Controlador_b.buscar_noticia

Hombre, para empezar, buscar_noticia es un método de instancia de
Controlador_b, y no un método de clase (que es como lo estás invocando).

De todos modos, no creo que instanciar Controlador_b y llamar a
buscar_noticia
sea una solución limpia. Si el código de buscar_noticia lo vas a invocar
en
más de un punto, quizás debieras pensar incluirlo en alguna biblioteca
(en
lib/) o incluso en el ApplicationController (prefiero la primera
solución,
pero bueno).

De todos modos, no sé qué quieres hacer exactamente.

Saludos.


Imobach González
Sosa

Correo-e: imobachgs en banot punto net


Ror-es mailing list
[email protected]

LLama Gratis a cualquier PC del Mundo.
Llamadas a fijos y móviles desde 1 céntimo por minuto.
http://es.voice.yahoo.com_______________________________________________
Ror-es mailing list
[email protected]


LLama Gratis a cualquier PC del Mundo.
Llamadas a fijos y móviles desde 1 céntimo por minuto.
http://es.voice.yahoo.com

On Feb 1, 2007, at 10:23 AM, congrio wrote:

El problema es que tanto noticias/listar_noticias y admin/
list_admin_news se conectan los dos a la misma base de datos
sacando asi los mismos datos.

Ah, si tienes “el mismo” modelo representado en bases de datos
distintas entonces hay que pensar un poquito mas, cuando leas sobre
bases de datos distintas normalmente se asume que cada una hace
persistente modelos distintos y ni siquiera relacionados en general.

La direccion de menos esfuerzo en el caso que explicas creo que es
tener clases distintas para cada base de datos. Por ejemplo:

class AbstractNews < AR::Base
self.abstract_class = true
… siguen metodos de noticias …
end

class NewsParaAdmin < AbstractNews
set_table_name ‘noticias’
establish_connection :admin
end

class NewsParaANoticias < AbstractNews
set_table_name ‘noticias’
establish_connection :noticias
end

Y no hacer nada mas. Si ambas tablas son iguales en cuato a su
estructura eso funciona gracias al duck typing, puesto que de un
objeto NewsParaAdmin o NewsParaNoticias solo usaras que responden a
tales y tales metodos.

Con ese codigo no hay que cargar ningun YAML ni hacer nada mas, con
eso deberia valer.

– fxn