2010-08-03 10 views
10

Böyle bir ActiveRecord modeli var:Rails/ActiveRecord geçişi yoluyla işlev tabanlı bir veritabanı tanılama dizini eklenebilir mi?

create_table "books" do |t| 
    t.string "title" 
end 

class Book < ActiveRecord::Base 
    default_scope :order => 'lower(title) DESC' 
end 

ben title özelliğin küçük forma göre sıralamak istiyorum görebilirsiniz, ancak bu veritabanı düzeyinde vurmak bir performans getirir gibi. Bu isabet farklı veri tabanları ile farklı şekillerde düzeltilebilir. Örneğin, PostgreSQL Oracle'da bir fonksiyon tabanlı bir dizin oluşturun:

CREATE INDEX lowercase_book_title_index ON book (lower(title)); 
Bir harmanlama belirtmek zorunda SQLite3 fonksiyonu tabanlı endekslere sahip değildir

:

CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE); 

I have not MySQL ile nasıl çalıştığınıza baktım ama eminim ki bir yol var (harmanlamalar? sanal sütunlar?).

Her halükarda bunu bir veritabanı-agnostik göçle uygun Rails tarzında yapmak istiyorum.

add_index :books, :title 

Ama bu üretir endeks harf duyarlıdır: Tabii bu gibi basit bir dizin oluşturabilirsiniz. Veritabanına bağımlı bir göçü yazabileceğimin farkındayım, ama çok zarif değil. Aynı zamanda pratik değil - Kendimi geliştirme iş istasyonlarımda ve PostgreSQL'te SQLite3'ü kullanarak buluyorum. Dizin adı, teklik ve uzunluk ile add_index anlaşması için kullanılabilir seçenekler. Burada yapmaya çalıştığım şeyi başarmanın bir yolunu mu görüyorum?

+0

Sorunuzla doğrudan ilgili olmayan, ancak geliştirme ve PostgreSQL'te SQLite kullanmak üretimde çok fazla keder yaratıyor. (Bu, Heroku kullanıcılarını çok ısırır. A * lot *.) PostgreSQL de ücretsiz olduğu için, SQLite'ye karşı geliştirmek gerçekten mantıklı değildir. –

+0

ActiveRecord'ın SQL yazmasına izin vermemi sağlayarak bana şaşırtıcı bir şekilde acı vermedi. MySQL'e karşı geliştirdiğimde ve PostgreSQL'e dağıtmak zorunda kaldığımda durum böyle değildi. – Sven

cevap

0

Bu tür bir sıralamada hiç sorun yaşamadım. Temelde, ne istediğini sonuçları bu şekilde sıralanır olmasıdır: bu doğruysa ve MySQL ile gidiş varsa, size database.yml bir harmanlama belirtebilirsiniz

"A bad title" 
"A better title" 
"a good title" 
"An excellent title" 

, deneyin:

production: 
    adapter: mysql2 # or mysql for rails < 3 
    host: ... 
    database: ... 
    username: ... 
    encoding: utf8 # or whatever you are using 
    collation: utf8_general_ci # or whatever fits your language and encoding 

utf8_general_ci, "utf8 ile bir dilde bağımsız bir şekilde harmanlamak ve büyük/küçük harfe duyarlı olmak" anlamına gelir.

Bu hile yapmalıdır.

+1

Bu doğru ve cevabınız için teşekkürler, ancak bunu yapmanın bir veritabanı-_agnostic_ yolunu arıyordum. Yani, sadece bir Rails göçü: MySQL'de bir blob veya PostgreSQL'de bir bytea haline gelen ikili bir sütun oluşturabilir, Rails migrasyonumda uygun bir şekilde ele alındığında büyük/küçük harfe duyarlı bir dizin belirtmek istiyorum. veritabanları arasında. – Sven

+0

Aynı konuya bakıyorum, bir çözüm buldunuz mu? default_scope'u 'düşük' seçeneği ile kullanmak önemli bir performans etkisine sahiptir? –

1

Kısa cevap: değil

Uzun cevap: değil, tüm veritabanı motorları destekler Raylar, ya da çok farklı bir şekilde neyi bunu destekleyecek çünkü. tüm veritabanı motorlarının desteklediğinden eminseniz, ActiveRecord geliştiricileri için bir özellik isteği gönderin.

senin Unutmayın: ActiveRecord göçlerde, sadece veritabanına özel maddeleri göçler ayrılan başlatmaları gerekiyor, tüm veritabanı motoru destekler ne isterse yapabilir.

Bu harmanlamayı, db: migrate sonra çalıştırılan ayrılmış bir komisyon görevinden ayarlamanızı öneririz. Daha büyük uygulamalarda, bu özel adımları uygulayabildiğim rake setup kullanıyorum.

İlgili konular