如何使用Postgres在DataMapper中进行不区分大小写的排序?

时间:2012-02-09 04:04:29

标签: ruby postgresql datamapper

所以,我试图从DataMapper订购我的结果而不考虑案例。现在,我做了Item.all(:order => :artist)之类的事情。我尝试过Item.all(:order => "LOWER(artist)"),但我发现错误LOWER(artist)不是Item的属性。使用DataMapper有一个很好的方法吗?

2 个答案:

答案 0 :(得分:2)

DataMapper可能不支持orders子句中的原始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

答案 1 :(得分:0)

我实际上最终使用了dm-ar-finders。它增加了Item.find_by_sql("SELECT * FROM items ORDER BY LOWER(artist)")之类的内容。为了提高性能,请确保在要更改的列上添加索引。