Home > Ruby on Rails > Ruby on Rails でデータをランダムに抽出する方法

Ruby on Rails でデータをランダムに抽出する方法

Ruby on Rails で一つツールを作っていて、一つのテーブルの
複数のフィールドからデータをランダムに各々データを抽出し
それを組み合わせて1つのレコードを作りたかったんだけど、
まったくどうしていいか分からなく、約3週間くらい、ずーっとつまづいていました。

いろいろと調べてもわからない。。
いろんな人に聞いても、なかなか解決策が見つからず。。

そんな時に、最後の頼みの綱として、はてなの人力検索で聞いてみました。

そしたら、いきなり回答をもらい、解決!

このようなかんじでした。

質問した内容が

テーブル(word table)にあるデータのフィールド毎(word1,word2,word3)に
ランダムにデータを抽出し、そのランダムに抽出した3つのフィールドのデータを
特定のページ(view.rhtml)に出力するということです。

このテーブルのデータを、特定のページ内(例:view.rhtml)に、
word1,word2,word3から各々ランダムに抽出したデータを
表示させたいと思っています。

完全にランダムなので、偶然同じレコードのものが3つ抽出される
ということでも構いません。

これを、controller/model/view にどのように書くとよいでしょうか。

SQL文で
select
(SELECT word1 FROM word ORDER BY RAND() limit 0,1) as word1,
(SELECT word2 FROM word ORDER BY RAND() limit 0,1) as word2,
(SELECT word3 FROM word ORDER BY RAND() limit 0,1) as word3
と書くと、求める値は取れるのを MySQL Query Browser では確認できましたが、
これをRailsでどのように記載すればよいかが分かりません。。


このような質問をしました。

そうしたら、回答として

http://d.hatena.ne.jp/moro/

URLはダミーというか自己紹介です。この問題についての情報はたぶんありません。

安直ですがこんなので如何がでしょう。find_by_sqlは便利ですね。モデルの配列を返すのでshiftしてます。


# app/models/word.rb
class Word < ActiveRecord::Base
def self.find_by_random
find_by_sql(<<-SQL).shift
select
(SELECT word1 FROM words ORDER BY RANDOM() limit 0,1) as word1,
(SELECT word2 FROM words ORDER BY RANDOM() limit 0,1) as word2,
(SELECT word3 FROM words ORDER BY RANDOM() limit 0,1) as word3
SQL
end
end

# appp/controllers/rand_controller.rb
class RandController < ApplicationController

def index
@word = Word.find_by_random
end
end

# app/views/rand/index.rhtml
<table>
<tr>
<td><%= @word.word1 %></td>
<td><%= @word.word2 %></td>
<td><%= @word.word3 %></td>
</tr>
</table></blockquote>
</blockquote>

SQL文のところが、「RANDOM()」となっていましたが、
これだとエラーが出てしまいまして、ここを「RAND()」とすることで
目的の情報を得ることができました。

本当に本当に「moroさん」には感謝感謝です。
モニターが涙でにじみました。。

それにしても、SQLを投げる方法がまだよーわかっていない。。

     
  • ご意見、ご感想などはコチラへどうぞー  

Trackback:0

TrackBack URL for this entry
http://yukaigi.com/cgi/mt/mt-tb.cgi/342
Listed below are links to weblogs that reference
Ruby on Rails でデータをランダムに抽出する方法 from 愉快議 ~実践塾~

Home > Ruby on Rails > Ruby on Rails でデータをランダムに抽出する方法

Search
Feeds
Want to see and hear

Page Top