0

更新: 皆様、ご回答ありがとうございます - ここにさらに重要な情報があります。

バックエンドに Neo4J グラフ データベース、ROR 3 (MRI)、および REST 経由でアクセスする単一の Neo4J データベース サーバーを使用しています。

Neo4j についてよく知らない場合、データ用に複数のデータベース サーバー (マスター/マスター) を使用するには 26,000 ドルかかります。 「これでどちらの方向に進んでいるか推測できると確信しています..そして、ローカルなどではなく、残りの部分を介して使用しているため、パフォーマンスは重要です...

すべてのデータベース作業を処理する必要がある 1 つのデータベース サーバーがあり、他のクエリが最大 40 ミリ秒かかるこのシナリオでは、はい 1 ミリ秒カウントされます。いいえ、データベースに不要な作業を追加するだけなので、不必要にデータベースにアクセスしたくありません。

ボトルネックと莫大なコストを考えると、「最適化やまだ行っていない問題についてはコーディングしないでください」と言うのは簡単かもしれません - そして、認証の部分を除いて、必要なことはすでに行っているという事実を考えると、実際にはそうではありません.適用されません。

私が知りたかったのは、 @current_user ||= がページ全体で有効かどうかということでした。答えは、リクエストで有効であり、ページやページで有効ではないということです。はい、これは簡単な質問ですが、R&D や高度な作業の最中に尋ねなければならないことがあります。したがって、ログインしているユーザーのIDを保持するためにセッションに固執するという私の直感。

ご協力いただきありがとうございます!


Cookie またはユーザー名とパスワードのいずれかを使用して、ユーザーが自分のサイトにログインできるようにしようとしています。ユーザー名/パスワードの部分は正常に機能しますが、Cookie の導入に問題があります....

http://ruby.railstutorial.org/chapters/sign-in-sign-outを含む「ハウツー」をたくさん用意しました。

gemやdeviseなどは使いたくない。

問題:

||=..

@current_user ||= User.find by blah blah blah を試しました

そしてそれは常にデータベースにヒットします。そんなはずないですよね?一度ヒットすればそれで終わりですよね?

しかし、チュートリアルを提案する前に-私はそれらのトンを見てきました-ここに私の質問があります.. @current_user はページ全体に保存されていますか、それとも現在のページだけに保存​​されていますか? 上記のリンクは、現在のページ用にのみ保存すると述べています...

お分かりのように、以前にログインした同じ人物を見つけるために不必要にデータベースにアクセスし続けたくありません.セッション変数を使用してそれを行うことができます。

私は本当に Cookie をチェックしたいだけで、その後も session[:user_id] を使い続けたいと思っています..パフォーマンス上の理由から、データベースにアクセスし続けたくありません。

何か助けはありますか?

私の新しいコードは以下のとおりです (これも、このインスタンスで必要なように、常にデータベースにヒットします)。典型的な @current_user ||= find_by.. を削除しました。役に立たなかったためです-常にデータベースにアクセスしていました。

.. https://github.com/cliftonm/basic-authhttp://ruby.railstutorial.org/chapters/sign-in-sign-outなどは既に試しました。

(ROR 3.2...)

class ApplicationController < ActionController::Base
  protect_from_forgery
  #before_filter :set_var

  helper_method :current_user

private



def current_user

         @current_user = User.find_by_id(session[:user_id]) #if session[:user_id]
         if (@current_user)
           return @current_user
         end


       @current_user =User.find_by_remember_token(cookies[:auth_token]) if cookies[:auth_token]
       if (@current_user)
         return @current_user
       end


 end
4

3 に答える 3

4

User.findある種のキャッシュ拡張機能がロードされていない限り、常にデータベースにヒットします。Rails.cacheいくつかの方法で構成できますが、この種のものが必要な場合に最も人気があるのはMemcachedです。

大規模なスケーリングの問題に対処している場合を除き、ユーザー レコードの取得に必要な時間は 1 ミリ秒未満であるため、大騒ぎする価値はほとんどありません。をチェックしてlog/development.log、さまざまなクエリの実行時間を確認し、最初に最も遅いクエリに注目してください。

のようなインスタンス変数は、リクエストの間だけ@current_user持続します。HTTP プロトコルはステートレスであり、各リクエストは他のリクエストとは独立して存在し、状態を伝達する唯一の方法は、Cookie、データベースのような永続ストア、メモリ内キャッシュのような一時ストア、またはGET または POST によるリクエスト自体。

ページを越えて何かを保存したい場合は、 に追加しますsessionが、注意してください。文字列、数値、ブール値などのみを永続化する必要があります。モデルを追加するべきではありません。さらに、デフォルトの Cookie ストアを使用すると、セッションに入れるたびに、ストアからそれを削除するまで、その時点からアプリケーションに対して行われるすべてのsessionリクエストのオーバーヘッドが増加します。

他のすべての問題が解決されるまで、ささいなことに悩まないでください。まずビジネス ロジック、次に最適化です。

于 2013-05-15T19:03:52.487 に答える
0

これらのいずれも、毎回データベースを非難するべきではありません。私にお知らせください。

     if (@current_user)
       @current_user
     else
       @current_user = User.find_by_id(session[:user_id])
     end

また

     @current_user ||= User.find_by(id: session[:user_id])
于 2015-05-13T18:08:44.020 に答える
-1

(ヘルパーの代わりに) before_filter を使用して current_user を 1 回だけロードしようとしましたか? 次に、インスタンス変数を使用して保存/アクセスします。

class ApplicationController < ActionController::Base
  before_filter :load_current_user

  def load_current_user
    @current_user = # your code goes here.
  end
end

編集:

私の悪い。サーバー側で暗号化された current_user レコードを Cookie に保存し、後で確認できるようにハッシュサムをセッションに保持するのはどうですか?

于 2013-05-15T19:10:53.300 に答える