Generador automático de consultas en Ruby on Rails

Estoy intentando hacer una especie de query builder en ruby on rails que permita al usuario crear consultas a la base de datos teniendo en cuenta todas las tablas y sus atributos.

Haciéndolo estoy aprendiendo mucho del código interno de ActiveRecord, os comento un par de trucos que he aprendido y alguna duda que me ha surgido.

  1. ¿Cómo sabe ActiveRecord las columnas de las tablas que forman los métodos de sus objetos? En mysql utiliza la query "SHOW FIELDS FROM nombre_tabla" y lo hace en el método ActiveRecord::Base.connection.columns(nombre_tabla).


  2. ¿Cómo saber las tablas que hay actualmente en la bd? Para saber esto he utilizado la sentencia sql de mysql "SHOW TABLES", ejecutando ActiveRecord::Base.connection.select_values("SHOW TABLES") obtenemos un array con todos los nombres de las tablas que hay en la bd.


  3. ¿Cómo saber que objetos ActiveRecord válidos hay en la aplicación RoR que estamos ejecutando a partir de la lista de nombres de tablas? Para hacer esto utilizo el siguiente código:

    table_names.each do |table_name|
    # comprobación de seguridad antes de hacer el eval.
    next if table_name.include?(";") or \
    table_name =~ /\s/
    table_name = table_name.classify
    begin
    activerecord_classes_names << table_name \
    if eval("#{table_name}.class == Class")
    rescue; end
    end

    No se si es la mejor manera, pero no se me ocurrió ninguna otra puesto que no he encontrado ningún método que me muestre las clases que existen en la aplicación, pero debe haberlo si tu lo sabes por favor dímelo ;)


  4. ¿Como saber las asociaciones que tiene un objeto ActiveRecord con otros objetos ActiveRecord? En la clase ActiveRecord existe el método de clase "reflections" que retorna un hash con los nombres de las asociaciones apuntando a objetos del tipo ActiveRecord::Reflection::AssociationReflection que, entre otros, tienen los siguientes atributos:
    • class_name: Nombre de la clase destino

    • macro: símbolo correspondiente al tipo de relación (has_many, belongs_to, ...)

Etiquetas: , ,


Recommend Me


XING
View Sergio Espeja's profile on LinkedIn