2012-02-09 2 views
3

私は大文字と小文字を区別せずにDataMapperから結果を注文しようとしています。今、私はItem.all(:order => :artist)のようなことをしています。 Item.all(:order => "LOWER(artist)")してみましたが、LOWER(artist)Itemのプロパティではないというエラーが表示されます。 DataMapperでこれを行う良い方法はありますか?PostgresでDataMapperで大文字と小文字を区別しない順序を行うにはどうしたらいいですか?

答えて

2

DataMapperは、ordering句でraw SQLをサポートしていない可能性があります。 https://github.com/datamapper/dm-core/pull/11にはさらに詳しい情報があります。本当に必要な場合は、あなたのバージョンのDataMapperにそのパッチを適用することができます。

DataMapperがそれをサポートしていたとしても、注文を効率化するために、低い(アーティスト)のインデックスが必要です。

代わりにしたいのは、アーティスト列にpostgresql citextデータ型を使用することです。大文字と小文字を区別しない検索と並べ替えを提供します。 http://www.postgresql.org/docs/9.1/static/citext.html

もしあなたがpostgresql 9.1を使用するのに十分なことがあれば、以下は素晴らしいでしょう。 < 9.1を使用している場合は、citextモジュールを別の方法で読み込む必要があります.postgresqlのドキュメントにはその方法が表示されます。

create extension citext; 

create table test (
    name citext 
); 

insert into test values ('a'), ('b'), ('X'), ('m'), ('D'); 

select * from test order by name; 

name 
------ 
a 
b 
D 
m 
X 
0

私は実際にdm-ar-findersを使用して終了しました。それはItem.find_by_sql("SELECT * FROM items ORDER BY LOWER(artist)")のようなものを追加します。パフォーマンスを向上させるために、変更されている列にインデックスを追加してください。

関連する問題