2011-03-31 11 views
6

He oído que puede atar un modelo en rieles a una vista de base de datos (en lugar de una tabla como de costumbre) y que esto es domo simplemente creando una vista con el nombre que normalmente tendría la tabla del modelo.¿Conectar un modelo de Rails a una vista de base de datos?

No estoy recibiendo esto funcione en los carriles con PostgreSQL 3.0.5 9.

¿Hay algo que me falta?

+0

¿Qué significa "No estoy haciendo que esto funcione"? ¿Errores? – Zabba

+0

Error: la tabla 'nombre_del_modelo_en_plural' no existe. La solución de Viacheslav Molokov funciona, sin embargo. – Valentin

Respuesta

9

rieles en ella de adaptador de PostgreSQL no se veía en pg_views vista por sus modelos.

Debe nombrar vistas con algunos nombres, sus modelos normales sí.

Se puede crear pequeño programa, como este para resolver este problema:

# -*- encoding: utf-8 -*- 

ActiveSupport.on_load(:active_record) do 
    ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do 
    def table_exists?(name) 
     return true if super 
     name   = name.to_s 
     schema, table = name.split('.', 2) 

     unless table # A table was provided without a schema 
     table = schema 
     schema = nil 
     end 

     if name =~ /^"/ # Handle quoted table names 
     table = name 
     schema = nil 
     end 

     query(<<-SQL).first[0].to_i > 0 
      SELECT COUNT(*) 
      FROM pg_views 
      WHERE viewname = '#{table.gsub(/(^"|"$)/,'')}' 
      #{schema ? "AND schemaname = '#{schema}'" : ''} 
     SQL 
    end 
    end 
end 

Coloque este archivo en RAILS_ROOT/config/initializers/postgresql_view_support.rb.

PS:

Este código es para Rails 3.0.5.

+1

Esto funciona y es fantástico. ¡Gracias! –

1

Supongo que puede ser algo relacionado con los plurales. Pero sin más información es difícil. La vista que ha creado debe ser un plural del modelo.

por ejemplo.

CREATE VIEW books AS (SELECT * FROM bookshelves) 

El modelo debe llamarse Libro.

O eso, o puede establecer una costumbre, plural incontable en config/inflections.rb

+0

Lo intenté y me funcionó una vez en otra aplicación, pero no es ahora. No estoy seguro de si es la rareza 3.0.5 o qué. Gracias por la ayuda. –

Cuestiones relacionadas