2016-08-24 16 views
1

私はイベントが何回見られたのかを何回も保存したいと思っています。基本的には、イベントの人気を発注するのに役立ちます。railsはページが何回閲覧されたかを保存します

だから、私はそれを行うと、DBの行が選択されているが、私のsearchkickは、表示する行を選択しています。

私は他の選択肢がないと思っていますが、showメソッドに入れることはできません。

HERESにいただきました!私のショー方法で(重要なのthats)

def show 
    @event = Event.find(params[:id]) 
end 

ビューが表示されたとき、それはカウントしていするための最良の方法だろうか?私もアドレスをIPにユニークだったので、それを持っている(ので、誰かがURLをスパムすることはできません)

サム

答えて

3

コールバックを使用することができます。 「ビュー」という名前のフィールドをイベントモデルに追加します。 は、このフィルタを追加します。

after_action :log_impression, only: [:show] 
.... 
def log_impression 
    @event.views += 1 
    @event.save 
end 

今、あなたは、インプレッション数でイベントを並べ替えることができます。

IPはスパム対策には適していません(動的IP、共有Wi-Fiなど)。 IPと他のもの(例えば、セッション、ユーザーエージェント)の組み合わせを使用することを検討してください。

宝石impressionistがあります。それはあなたのために仕事をします。

0

あなたが列を持つテーブルを別のモデルが必要になることができれば理想的にはそれは素晴らしいだろうip-addressを保存します。次に、event.idごとに一意のIPアドレスのロジックを実装します。 ip-addressを渡してイベントをロードした直後に、そのモデルのエントリを作成します。 イベントモデルのカウンタキャッシュ列が良い考えです。

イベントを参照する文字列ip_addressと整数event_idを持つモデルEventViewを作成します。 EventViewはあなたのcontroller`sでbelongs_to :eventと をあなたがこれを行うアクションを示して取得します。

EventView.where(event: @event, ip_address: request.env['REMOTE_ADDR']).first_or_create 

これは、各IPアドレスはevent.idごとに記録されwhill

Eventモデルは、その後has_many :event_views を取得していることを確認し、します@event.event_views.count経由でユニークなビューの数が得られます

+0

私はまだまだレールに新しくなっています。どうすればこのo.oをやりますか?例えば、 –

+0

。 EventViewという名前の新しいモデルに、ip_addressという名前の文字列を追加します。 – neongrau

関連する問題