2

私はこれを検索しましたが、答えが見つからなかったので驚いたので、これを複雑にしすぎている可能性があります。しかし、基本的に、Rails 3アプリケーションにはRESTfulモデルがいくつかあります。これらのモデルは、時間の経過に伴う人気の追跡のために、非常に簡単な方法で追跡したいと考えています。私の場合、GET / showメソッドでのヒットの追跡にのみ関心があります。ユーザーはログインしてこれら2つのリソースを表示し、表示/ページの読み込みごとに訪問数が増加します。

そこで、Booksモデルに「visits」列を配置しました。

==  AddVisitsToBooks: migrating ===============================================
-- add_column(:books, :visits, :integer)
-> 0.0008s
==  AddVisitsToBooks: migrated (0.0009s) ======================================

列はゼロに初期化され、その後、基本的に、books_controller内で、

def show
  unless @book.owner == current_user      #hypothetically, we won't let an owner 
                                          "cheat" their way to being popular
  @book.visits = @book.visits + 1
  @book.save
end

これは正常に機能しますが、showメソッドが呼び出されるたびに、オブジェクトレコードの読み取りアクションだけでなく、書き込みも実行されるようになりました。そして、おそらくそれが私の質問の核心になります。単一の整数の変更を挿入するために必要な総オーバーヘッドは、中小規模の本番アプリで大きな問題になりますか?それとも、それは小さな取引ですか、それとも基本的に何もありませんか?

それを行うためのはるかに賢い方法はありますか?私が思いついた他のすべては、与えられたページが表示されるたびにレコードに書き込むことをまだ含んでいました。フィールドで検索することはめったにありませんが、フィールドのインデックスを作成すると役立ちますか?

ちなみに、データベースはPostgreSQL 9(Herokuで実行)です。

ありがとう!

4

2 に答える 2

4

上記で説明したことには、1つの重要な短所があります。プロセスがデータベースを更新すると(訪問カウンターを増やす)、行がブロックされ、他のプロセスがある場合は待機する必要があります。この理由から、DBシーケンスを使用することをお勧めします:http:// www.postgresql.org/docs/8.1/static/sql-createsequence.htmlただし、コードでカスタムシーケンスを維持する必要があります:Ruby on Rails + PostgreSQL:カスタムシーケンスの使用

于 2013-02-03T23:45:59.213 に答える
2

さらに検索した後、MiGroが言ったように、ページが表示されるたびに、ほんの一瞬であっても行がブロックされるため、モデル自体から訪問カウンターを削除することにしました。DBシーケンスのアプローチはおそらく最速だと思います。これからさらに調査しますが、今のところ、それは私を少し超えており、ActiveRecordに実装するのは少し面倒なようです。したがって、

https://github.com/charlotte-ruby/impressionist

まともな選択肢のようです。ビューカウントを別のテーブルに保持し、1200台を超えるロボットなどのブラックリストを持つgemを利用します。

于 2013-02-04T18:07:51.587 に答える