Railsアプリのすべてのページで、データベース内の単一のテーブルから単一の(ランダムに選択された)オブジェクトをロードしようとしています。
たとえば、テーブルに複数の引用符が含まれる引用符テーブルがあり、ページの読み込みごとに 1 つだけが必要です。
これを達成するための最良の方法は何ですか? 明らかに、クエリを各コントローラーにコピーして貼り付けることは、これを行う正しい方法ではありません。
Railsアプリのすべてのページで、データベース内の単一のテーブルから単一の(ランダムに選択された)オブジェクトをロードしようとしています。
たとえば、テーブルに複数の引用符が含まれる引用符テーブルがあり、ページの読み込みごとに 1 つだけが必要です。
これを達成するための最良の方法は何ですか? 明らかに、クエリを各コントローラーにコピーして貼り付けることは、これを行う正しい方法ではありません。
これには使用before_filter
しません。リダイレクト アクションやその他の「レンダリングされない」アクションでデータベースにアクセスする必要はありません。代わりに を使用helper_function
し、とにかく配置する必要があるため、レイアウトで呼び出します。
def random_quote
@quote ||= "Select random quote here"
end
helper_method :random_quote
見積もりの選択方法はあなた次第です。random_quote
レイアウトで通常のヘルパー メソッドとしてアクセスするだけです。これは、レイアウトがレンダリングされている場合にのみ、アクションごとに 1 つの見積もりにのみアクセスします。
この種のものは通常before_filter
、ApplicationControllerに含まれます。
before_filter :get_random_quote
#This code is executed before every action of your app
def get_random_quote
random_id = ...#Generate a random ID ...
@random_quote = Quote.find(random_id)
end
次に、あなたの見解では、を参照してください@random_quote
。終わり!
編集:考え直してみると、Matziソリューションの方が賢いようです。リクエストは、実際に何かを出力したときにのみ呼び出されます。無駄なことは何もありません。
PostgreSQL の場合:
before_filter :get_quote
def get_quote
@quote = Quote.order('RANDOM()').limit(1)
end