Active Records case insensitive find

0 views
Skip to first unread message

maras...@gmail.com

unread,
Jan 13, 2010, 3:13:02 PM1/13/10
to Ruby on Rails: България
Здравейте .

Имам един прост и конкретен въпрос :
например имам SomeTable.find(:all, :conditions => {:name => "some
string"}) .
Искам да направа case insensitive find за "some string" , като да ми
връща резултати за name без да взима предвид регистъра на знаците .

Поздрави,
Емил

Denitsa Belogusheva

unread,
Jan 13, 2010, 3:33:23 PM1/13/10
to ruby-on-rai...@googlegroups.com
Здравей,

SomeTable.find(:all, :conditions =>['lower(name) = ?', "some string".downcase])

btw такива въпроси има отговорени в ruby-forum.com, а сигурно и в основната rails google група, може да търсиш и там

Поздрави
Дени


--
Това писмо идва от пощенския списък „Ruby on Rails: България“.
За да се отпишете: ruby-on-rails-bul...@googlegroups.com
Останалите екстри: http://groups.google.com/group/ruby-on-rails-bulgaria?hl=bg

Stefan Kanev

unread,
Jan 13, 2010, 3:47:19 PM1/13/10
to ruby-on-rai...@googlegroups.com
Никак не харесвам това да се прави наполовина в ruby ("some string".downcase) и наполовина в SQL ('lower(name)'). Ако само едно от двете не се оправя с unicode, то ходи си търси бъговете тогава. "Стефан".downcase връща "Стефан", например. Най-добре забий и двете в базата.

Първо, ако ползваш MySQL го имаш out of the box. Сравненията там са case insensitive. Честито.

Ако пък си с PostgreSQL (или каквото и да е друго), то :conditions => ['lower(name) = lower(?)', 'some string'] ти работа. Ако имаш нужда от индекс става една идея по-сложно, но не мисля, че това ти е случая.

Отделно, пита ли Google преди да питаш тук? Струва ми се, че лесно се намира отговор на тоя въпрос...

2010/1/13 Denitsa Belogusheva <denitsa.b...@gmail.com>

Sava Chankov

unread,
Jan 13, 2010, 3:56:33 PM1/13/10
to ruby-on-rai...@googlegroups.com
2010/1/13 Stefan Kanev <stefan...@gmail.com>
Ако пък си с PostgreSQL (или каквото и да е друго), то :conditions => ['lower(name) = lower(?)', 'some string'] ти работа. Ако имаш нужда от индекс става една идея по-сложно, но не мисля, че това ти е случая.

PostgreSQL поддържа функционални индекси като lower(name) от десетина години насам.

maras...@gmail.com

unread,
Jan 14, 2010, 4:03:46 AM1/14/10
to Ruby on Rails: България
Ха , Сетфане как позна чe си имам работа с unicode :)

Ами да ровнах, проблема е там че: "Низ на Български or String in
English".mb_chars.downcase.to_s ,
ако е само "Низ на Български" ще работи но ако е "String in English"
няма да работи , а не се знае какво ще дойде .
И затова реших на find да оставя тази задача, но сега сещам че може
да направя една проверка с is_mb_chars? ако има такова животно .
Отивам да видя в документацията на ActiveSupport .

Мерси за помощта и съветите поздрави :)

On Jan 13, 10:56 pm, Sava Chankov <sava.chan...@gmail.com> wrote:
> 2010/1/13 Stefan Kanev <stefan.ka...@gmail.com>


>
>
>
> > Ако пък си с PostgreSQL (или каквото и да е друго), то :conditions =>
> > ['lower(name) = lower(?)', 'some string'] ти работа. Ако имаш нужда от
> > индекс става една идея по-сложно, но не мисля, че това ти е случая.
>
> PostgreSQL поддържа функционални индекси като

> lower(name)<http://www.postgresql.org/docs/8.0/interactive/indexes-expressional.html>от
> десетина години насам.

Stefan Kanev

unread,
Jan 14, 2010, 4:51:52 AM1/14/10
to ruby-on-rai...@googlegroups.com
Само от любопитство, пробва ли да оставиш базата данни да ти сравни стринговете, вместо да правиш излишни неща в Ruby?

Valentin Mihov

unread,
Jan 14, 2010, 7:01:41 AM1/14/10
to ruby-on-rai...@googlegroups.com
А аз си мисля, че не винаги сравненията в MySQL са case insensitive.
Това зависи от collation-а, както и от други фактори. Мисля, че
документацията е добро място да се види какво всъщност става:

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

Иначе решението на Стефан ми се вижда най-доборо, което може да се
направи. Особенно с ruby 1.8 не бих разчитал на downcase за unicode
низове.

--Вальо

2010/1/14 Stefan Kanev <stefan...@gmail.com>:

maras...@gmail.com

unread,
Jan 14, 2010, 8:05:56 AM1/14/10
to Ruby on Rails: България
Да и проработи, цялата работа беше заради "stupid bug":

Иначе и на мене ми се стори странно в началото , понеже ползвам
utf8_general_ci, което означава че сам mysql трябва да си прави case
insensitive .
Грешката ми беше че не оставих от началото mysql сам да си свърши
работата аз започнах да мисля как да ги изравнявам .

Благодаря за помощта :)

On Jan 14, 11:51 am, Stefan Kanev <stefan.ka...@gmail.com> wrote:
> Само от любопитство, пробва ли да оставиш базата данни да ти сравни
> стринговете, вместо да правиш излишни неща в Ruby?
>

> 2010/1/14 marashl...@gmail.com <marashl...@gmail.com>

Reply all
Reply to author
Forward
0 new messages