Rails

2011-07-31 21 views
11

ile Postgres büyük harf duyarlı olmayan arama geliştirme veritabanım SQLite ancak uygulamanızı Heroku'ya dağıtırım ve PostgreSQL kullanıyorlar.Rails

Bazen PostgreSQL büyük/küçük harfe duyarlı olduğu için SQLite olmadığı için arama yaptığımda iki farklı sonuç çıkıyor.

Raylar bu şeyleri standartlaştırmamalı mıdır? Bunu çözmek için hangi yöntemleri kullanmalıyım? Postgres

Here is how to fix it with raw SQL

+1

Heroku'ya konuşlandırıyorsanız PostgreSQL'in üzerine geliştirmenizi öneririm. Hiçbir ORM sizi veritabanına özgü davranışlardan koruyamaz. –

+1

Ve ben SQLite yerel ve Postgre nakliye kullanarak kullanmayı seviyorum, bu yüzden belirli bir DB'ye bağlı değilim. herkesinki kendine. –

cevap

41

Vaka duyarsız arama:

  • kullanım ilike yerine (harf büyüklüğüne duyarsız gibi) like ait
  • Eğer = kullanmak her iki tarafın ÜST veya
  • ALT ya yapmak istiyorsanız
+4

Teşekkür ederiz! 'Like' ile ilgili problem, onları 'OR' operatörüyle nasıl zincirleyeceğimi bilmem. Her desteklenen db ile bu raylar tarafından kullanmak için tasarruf mu? '' ALT (başlık) LIKE LOWER ('% # {search_term}%') "' – antpaw

+1

de mysql, sqlite ve pgsql kodumu frenlemiyor bu yüzden yeterince iyi, teşekkürler! – antpaw

+0

aynı kodu hem MYSQL hem de POSTGRES üzerinde çalıştırmak istiyorsanız UPPER veya LOWER kullanın (bu kesinlikle en iyi uygulama olmasa da!) –

4

Başka bir DDL işleme biçimi buyoludurveri türü veya büyük harf duyarlı TEXT.

4

ActiveRecord'un işlemediği pek çok yaygın olağan şey vardır ve LIKE eşleşmesi bunlardan biridir. Bunun yerine düz Arel kullanarak bunu nasıl elde edersiniz.

Model.where(
    Model.arel_table[:title].matches("%#{search_term}%") 
) 

Sen yapmak Arel-Helpers yükleyebilirsiniz bu biraz daha kolay

Model.where(Model[:title].matches("%#{search_term}%")) 

Ben daha önce bunun için Squeel önerilen, ancak orijinal yaratıcısı bunu destekleyen durdurdu ve bir tam olarak görünmüyor zaman geliştirici bunu sürdürüyor. Ve özel ActiveRecord API'ları ile oynadığı için, sürekli eğilimi gerektirir.

+0

Harika çözüm ve Squeel harika, ama sadece bu bir Postgres-spesifik davranış olduğunu. Bunu diğer RDBMS için yapmak istiyorsanız, çıktı büyük/küçük harfe duyarlı olabilir. – kgx

+0

@kgx aslında bu örnek her iki durumda da amaçlandığı şekilde çalışacaktır. @antpaw yukarıda belirttiği gibi, SQLite 'LIKE' varsayılan olarak büyük/küçük harf duyarlıdır. Yani bu PostgreSQL'de SQLite ve 'ILIKE' 'da' LIKE'ı kullanacaktır. –