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 Responses to “Atsitiktinio įrašo suradimas su ActiveRecord”

  1. Lucy Says:

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

  2. bigzel Says:

    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. admin Says:

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

  4. Emilis Says:

    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. Lukas Says:

    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 Comment