2011-07-29 13 views
1

Deviseがユーザーをログインすると、ユーザーIDのみがセッションに格納されているようです。 これは、current_userを呼び出すと、SQLクエリー(User.find(:id)のようなもの)がUserオブジェクトを作成するたびに発生し、多くの場合、不必要な読み込みが行われることを意味します。
たとえば、レイアウトファイル内の右上のヘッダーにユーザーの名前を表示し、すべての応答でレンダリングされるようにすることができます。そのためには、と書くだけで、usersテーブルへのSQLクエリが行われます。Deviseをカスタマイズしてセッションにさらに情報を格納する方法は?

実際のユーザーの基本情報(名前や電子メールなど)をセッションに保存して、余分なSQLクエリを避けたいと思っています。

この問題の正しい解決方法を教えてください。

答えて

2

すでにお持ち帰りください。そのSQLクエリは事実上無料です。 User.find(id)からのパフォーマンスの問題が実際に表示されている場合は、アプリ/データベース/サーバーが完全に不正になります。

さらに、セッションにさらにデータを格納することで、もはや最新ではないデータを表示する可能性があります。ユーザーが自分の情報を編集できるようにしますか?その場合、名前を編集するとどうなりますか?本当の報酬がないという面倒です。

+0

なぜ「そのSQLクエリは効果的に無料ですか」とお考えですか?私はこれが本当に避けられるべき余分な質問だと思う。ユーザーが自分の名前を更新すると、セッションを更新するだけで済みます。 – Tao

+0

このクエリはプライマリキーを使用してレコードを検索するので、データベースはレコードを非常に高速に返します。次に、ActiveRecordはレコードオブジェクトのインスタンスを作成しますが、単一のARレコードが作成するのが非常に迅速です。ルール1:最適化前後のプロファイル。これは思慮のない時期尚早の最適化のようなものです。このユーザー検索を追加すると、ページの作成時間が大幅に変更される場合、a)アプリケーションはデータベースで何もしていないか、b)データベーステーブル/インデックスが不正になっているため、修正または再調整する必要があります。 –

+0

大丈夫、ありがとう〜 – Tao

関連する問題