úterý 20. listopadu 2007

ActiveRecord and BigDecimal problem with decimal point

We are using database with Czech Collation (Locales) and Czech language uses comma as decimal point. ActiveRecord (and BigDecimal) are not written for using comma. So, when another character than digit or point appears on input, input is stopped and previous parsed text is returned as number.
We have to compute with prices that are decimal. In database is stored something like 123,45 but after calling

> Amount.find(1).value

we received 123 instead of 123.45 (#<BigDecimal:4b5850c,'0.12345e3',8(12)>)
I traced ActiveRecord and found that method find (its internal implementation) uses method instantiate and it calls object.instance_variable_set("@attributes", record) and this method is just stub for C runtime libraries.
So I created solution - override method instance_variable_set in model class Amount like this:


def instance_variable_set symbol, obj
super
if symbol == "@attributes"
input = obj["value"]
unless input.nil? or input.index(",").nil?
input[input.index(",")] = "."
@value = BigDecimal.new(input)
end
end
end

Any better solution?

sobota 3. listopadu 2007

TMOU 9

I letos bylo TMOU naprosto famozni. V 17 hodin vse vypuklo hymnou na namesti Svobody a pak bylo TMOU vsude kolem nas.. demonstranti, bezdomovci, Ivos se svoji basnickou, roztleskavacky, Jan Skacel se svou napovedou, telefonni budky :)
Po chvili bezmocneho pobihani kolem jsme zjistili o co jde a zacli postupne sbirat hesla k desifrovani prvni sifry. Dokonce dle statistiky na strankach TMOU jsme porazili budouciho viteze na prvni sifre (diky abecede :), Prahory maj smulu)
Druhou sifru jsme zvladli bravurne aneb nadherne to vyjadrila slova Martinky "je vyborny, ze nejsme prvni, uz vedela na kolik to ma zvetsit".
Vyrazili jsme tedy na dalsi stanoviste, ktere jsme malem minuli, ale nastesti jsem se zeptal chlapcu pod mostem, zda lusti a oni byli na tolik solidarni, ze mi ten cip dali :) Akorat jsem nemohl trefit spravne nasi tajnou frazi, tak me trosku zalil pot, co jsem tam vlastne zadal. Lusteni teto sifry bylo nejzabavnejsi (viz foto), navic jsme lustili v teple, tak jsme byli maximalne spokojeni. I proto jsme na Karaskovo namesti bezeli jen dva a vraceli se zpatky do tepla.
Mapa nas trosku zradila, premysleli jsme co by to mohlo byt, jaka hora.. Spilberk, Bila hora?! Takze cast tymu se vydala smerem na Bilou horu, ale stihli jsme je jeste stopnout a dohnat na Stare Osade a vydali s k hrbitovu. Zde byla podle me nejzabavnejsi sifra, kterou jsme potkali, protoze vymysleni tretiho slova k predchozim dvoum bylo ... Martin prekvapil svymi prispevky: "Zeny, vino, zpev" a "Sex, drogy, rockandroll". Knedlo-zelo-vepro jsme nedali, ale cast, kterou jsme meli, nam stacila na presun k sose u skoly na Masarove.
No a tady byla pro nas konecna :-/- nejaka krychle. Princip jsme pochopili, ale precist ji - to byl problem. Po dvou hodinach jsme se vydali pro napovedu.. pak dalsi a pak jsme se rozhodli to zabalit.. cestou jsme (druha cast tymu) jeste potkali treti napovedu a nasli reseni, ale uz jsme to nesvolavali zpet a spokojeni sli spat.. Bylo to bajecne a priste to bude zase o chlup lepsi :)