Atsitiktinio įrašo suradimas su ActiveRecord

Norint surasti atsitiktinį įrašą MySQL’e naudojame

[code]

SELECT * FROM products ORDER BY rand();
[/code]

Norint tą gražiai atlikti su ActiveRecord galime panaudoti

[code]

Product.find(:all, :order => ‘rand()’)

[/code]

Update: tas pats, bet PostgreSQL’ui
[code]

Product.find(:all, :order => ‘random()’)

[/code]

5 Replies to “Atsitiktinio įrašo suradimas su ActiveRecord”

  1. Hmm, “ORDER BY rand()” labai neracionalus sprendimas, įvertinant tai, kad atsitiktinio sk. generavimas yra “brangi” operacija, o tokių operacijų generuojama kiekvienai eilutei…

  2. Atsizvelgiant i Lucy komentarus, del optimalumo, galime patobulinti kreipimasi: “Product.find(:all, :order => ‘rand()’, :limit => 10)”. Tokiu atveju rand’as veiks tik ant siu eiluciu. Ir avis sveika ir vilkas sotus 🙂

  3. Ačiū už komentarus. Iš tikrųjų tai kodas ir naudoja limit’ą, kadangi reikia parodyti tik keletą random item’ų, o ne visus =)

  4. Kiek pamenu tokie dalykai didelėms lentelėms užstabdytų…

    Reikėtų pasitestuoti su dideliu duomenų kiekiu/didele apkrova.

    Alternatyvūs variantai:

    – išsitraukti visus ID ir random() atlikti programavimo kalboje.

    – SELECT id FROM products ORDER BY rand(); ir po to SELECT * FROM products WHERE id=ID;

    Beje, skirtingas kodas MySQL ir PostgreSQL — labai neelegantiška.

  5. Jei jau radau aš, gal dar kas ras… 🙂

    SELECT count() as total_cnt FROM A

    ir antra užklausa

    SELECT * FROM A LIMIT rand (0, total_cnt), 1

    t.y. pirma gaunam, kiek viso įrašų yra, aks yra labai greita su index’ais, tada išrenkam vieną vienintelę eilutę paprastu selectu, kas vėlgi labai greita 😉

Leave a Reply to Lucy Cancel reply

Your email address will not be published. Required fields are marked *