que tienen un modelo ActiveRecord como esto:¿Es posible agregar un índice independiente de la base de datos basado en funciones a través de una migración de Rails/ActiveRecord?
create_table "books" do |t|
t.string "title"
end
class Book < ActiveRecord::Base
default_scope :order => 'lower(title) DESC'
end
Como se puede ver que quiero para ordenar por la forma minúscula del atributo title
, pero esto impone un impacto en el rendimiento a nivel de base de datos. Este golpe puede remediarse de diferentes maneras con diferentes bases de datos. Por ejemplo, en PostgreSQL u Oracle crea un índice basado en las funciones:
CREATE INDEX lowercase_book_title_index ON book (lower(title));
SQLite3 no tiene índices basados en funciones por lo que tiene que especificar una colación:
CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE);
yo no tengo investigó cómo lo hace con MySQL pero estoy seguro de que hay una manera (¿colaciones ?, ¿columnas virtuales?).
En cualquier caso, me gustaría hacer esto de la manera adecuada de Rails con una migración independiente de la base de datos. Por supuesto, puedo crear un índice simple como este:
add_index :books, :title
Pero el índice que genera distingue entre mayúsculas y minúsculas. Me doy cuenta de que podría escribir una migración dependiente de la base de datos, pero no es muy elegante. Tampoco es práctico. A menudo me encuentro usando SQLite3 en mis estaciones de trabajo de desarrollo y PostgreSQL en producción. Las opciones disponibles para add_index tratan con el nombre del índice, la singularidad y la longitud. ¿Estoy pasando por alto una forma de lograr lo que estoy tratando de hacer aquí?
No está directamente relacionado con su pregunta, pero usar SQLite en desarrollo y PostgreSQL en producción causa mucho dolor. (Muerde mucho a los usuarios de Heroku. A * lot *.) Como PostgreSQL también es gratuito, no tiene sentido desarrollarlo contra SQLite. –
Ha sido sorprendentemente sin dolor para mí, siempre que deje que ActiveRecord escriba el SQL. Este no fue el caso cuando estaba desarrollando MySQL y luego tuve que implementarlo en PostgreSQL. – Sven