2012-08-04 12 views
9

Rayları [derste SAAS kursunu takip ederek] öğrenmeye ve ActiveRecord kullanarak basit Film tablosuyla çalışmayı deniyorum.Raylar: ActiveRecord db sıralama işlemi büyük/küçük harfe duyarsız

Tüm filmleri başlıklı sırayla görüntülemek istiyorum. Durumun duyarsız olarak sıralanmasını istiyorum.

Movie.all(:conditions => ["lower(title) = ?", title.downcase],:order => "title DESC") 
=>undefined local variable or method `title' for #<MoviesController:0xb4da9a8> 

ben alt (başlık) tanımak doesnt düşünüyorum:

ben bu şekilde yapıyor çalıştı.

Bu, inspectitve sort türüne ulaşmanın en iyi yolu mu?

Teşekkürler!

cevap

16
Kullanım where

değil all

Movie.where("lower(title) = ?", title.downcase).order("title DESC") 

gerçekten olsa tür anlamıyorum. Burada, title.downcase'a eşit olan daha düşük bir başlığa sahip tüm filmleri elde edersiniz. Her şey eşittir, title desc ile nasıl sıralayabilirsiniz?

küçük başlığı ters alfabetik film sıralamak için:

Movie.order("lower(title) DESC").all 
3

MySQL üst ya da alt durum işlemi her zaman yerine sahip oldukça pahalıdır.

Tavsiye ettiğim şey, title sütun ve title_lower sütun içeriyor. Bu şekilde, MySQL'in sıralamanızı her defasında üst veya alt gerçekleştirmesine gerek kalmadan title_lower sütununda kolayca büyük/küçük harf duyarsızlığı gösterebilir ve sıralayabilirsiniz.

Hem en az hem de en az title_lower dizinini unutmayın.

5

Bunu yapmak zorunda:

Movie.order("lower(title) DESC").all 
0

bir daha sağlam bir çözüm arel düğümleri kullanmaktır. Sonra Movie.for_title(title).order_by_title

listelenen diğer cevaplar üzerinde avantaj .for_title ve .order_by_titletitle sütuna takma eğer kırılmaz olmasıdır veya çağrı

scope :order_by_title, -> { 
    order(arel_table['title'].lower.desc) 
} 

scope :for_title, (title)-> { 
    where(arel_table['title'].lower.eq title.downcase) 
} 

ve: Ben Movie modeline birkaç kapsamları tanımlayan öneriyoruz title sütunuyla başka bir tabloya katıl ve bunlar sql çıkışı.

rickypai mentioned gibi, sütun üzerinde bir diziniz yoksa, veritabanı yavaş olacaktır. Ancak, verilerinizi kopyalamak ve başka bir sütuna dönüşüm uygulamak için kötü (normal) formdur, çünkü bir sütun diğeriyle eşitlenemez. Maalesef, daha önceki mysql sürümleri, tetikleyiciler dışındaki birçok alternatives'a izin vermedi. 5.7.5'ten sonra bunu yapmak için sanal generated columns'u kullanabilirsiniz. Daha sonra, duyarsız durumlarda, sadece oluşturulan sütunu kullanırsınız (bu aslında ruby'yi daha da ileriye doğru yapar).

Postgres bu konuda biraz daha fazla esnekliğe sahiptir ve özel bir sütuna başvurmak zorunda kalmadan işlevler üzerinde dizinler oluşturmanıza izin verir veya sütunu büyük/küçük harf duyarlı olmayan bir sütun haline getirebilirsiniz.

İlgili konular