Как я могу сделать заказ без учета регистра в DataMapper с Postgres? - PullRequest
3 голосов
/ 09 февраля 2012

Итак, я пытаюсь заказать результаты из DataMapper без учета кейса.Прямо сейчас я делаю что-то вроде Item.all(:order => :artist).Я попытался сделать Item.all(:order => "LOWER(artist)"), но я просто получаю сообщение об ошибке, что LOWER(artist) не является свойством Item.Есть ли хороший способ сделать это с помощью DataMapper?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

DataMapper может не поддерживать raw sql в предложении заказа. https://github.com/datamapper/dm-core/pull/11 имеет больше информации. Если вам это действительно нужно, вы можете применить этот патч к вашей версии DataMapper.

Даже если бы DataMapper его поддерживал, вам также понадобился бы индекс для более низкого (Artist), чтобы упорядочить порядок эффективно.

Вместо этого вы, вероятно, захотите использовать тип данных postgresql citext для столбца Artist. Он обеспечивает поиск и упорядочение без учета регистра. http://www.postgresql.org/docs/9.1/static/citext.html

Если вам повезло, что вы используете postgresql 9.1, то приведенное ниже должно работать отлично. Если вы используете <9.1, вам нужно загрузить модуль citext по-другому, документы postgresql должны показать вам, как это сделать. </p>

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 голосов
/ 13 апреля 2012

Я фактически использовал dm-ar-finders для этого. Он добавляет такие вещи, как Item.find_by_sql("SELECT * FROM items ORDER BY LOWER(artist)"). Просто убедитесь, что вы добавляете индекс для любого изменяемого столбца, для повышения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...