2009-08-16 16 views
16

Tengo una consulta SQL que no es específica de la tabla y no sé cómo manejarla con Ruby On Rails.Consulta SQL personalizada sin la tabla correspondiente

Aquí mi consulta SQL (que no es necesario para entenderlo):

SELECT type, actor_id, events.created_at, photo_id, photos.user_id FROM 
(SELECT 'comment' AS type, user_id AS actor_id, created_at, photo_id FROM comments 
UNION 
SELECT 'classification' AS type, user_id AS actor_id, created_at, photo_id FROM classifications) 
AS events 
INNER JOIN photos ON photo_id = photos.id 
WHERE user_id = #{@user.id} 
ORDER BY created_at DESC 
LIMIT 9

que intentó crear un modelo y utilizar un find_by_sql:


class RecentActivity ActiveRecord::Base 
    attr_accessor :type, :actor_id, :created_at, :photo_id, :user_id 
end 

me sale:

Mysql::Error: Table 'mysite_development.recent_activities' doesn't exist: SHOW FIELDS FROM `recent_activities`

¿Cómo puedo evitar este mensaje? ¿Hay alguna solución alternativa?

+0

¿Qué quiere decir, Veo tablas en esa consulta. –

+0

No hay ninguna tabla MySql que se llame recent_activities y corresponda al modelo. – collimarco

Respuesta

36

Puede tomar una conexión db directamente desde ActiveRecord :: Base, pero no es tan útil como extender AR :: Base, porque los métodos útiles como sanitize_sql están protegidos.

class ComplexQueries < ActiveRecord::Base 
    def self.my_query 
    # Notice how you can, and should, still sanitize params here. 
    self.connection.execute(sanitize_sql(["select * from foo limit ?", 10])) 
    end 
end 

results = ComplexQueries.my_query 
results.each_hash{|h| puts h.inspect} 
+0

Gracias! Exactamente lo que estaba buscando. – collimarco

+0

¡Yo también! En realidad, la única rareza aquí es con la última fila; probablemente quieras hacer: results.each_hash {| h | print "# {h} \ n"} En mi consulta, .inspect no mostró nada. – aronchick

+0

Si h tiene datos, imprimirlos o imprimir los resultados de h.inspect funcionarían. ¿Olvidaste los "puts" delante de h.inspect? – jdl

0

Si desea crear clases (modelos) que no están apoyando a una base de datos que necesita para no afirmar que están heredando de ActiveRecord.

hacer

class RecentActivity 

En lugar de

class RecentActivity < ActiveRecord::Base 

Dicho esto, todavía podría ser útil para conseguir algo más de información sobre lo que está tratando de hacer: por ejemplo, si usted quiere tener algo así como "comentarios" o "imágenes" en varias cosas diferentes, como un artículo, o perfil de alguien o blogpost, todo dentro de la misma aplicación, recomendaría visitar PolyMorphic Associations.

+0

Lo que necesito es ejecutar la consulta anterior y crear una instancia de algunos objetos con su contenido. – collimarco

7

También puede tomar la conexión ActiveRecord y llame select_all: "? No-tabla específica"

ActiveRecord::Base.connection.select_all('select * from foo').each do |e| 
    puts e.inspect 
end 
Cuestiones relacionadas