nagurigakinの日記

日常、技術系を。気合い入れると続かないのでゆるふわ。

Railsキャッシュの手法

読み込みがあまりにも遅いページがあったので、初めてキャッシュを導入しようとした時のめもです。

キャッシュの手法は 3つあり、

1, ページキャッシュ (ページごとのキャッシュ)
2, アクションキャッシュ (アクションごとのキャッシュ)
3, フラグメントキャッシュ (部品(header, each文等)ごとのキャッシュ)

これだけ覚えておけばよさそう。

今回はindexアクションが遅いということで、
はじめに2のアクションキャッシュを使用してみました。

gem 'actionpack-action_caching'
bundle install

※development環境でもキャッシュを有効にするためにdevelopment.rbの以下をtrueに変更

config.action_controller.perform_caching = true

遅いと原因となっているcontrollerに caches_action :index を追記した。

class SampeController < ApplicationController
  caches_action :index
  def index
  end
end

これでページをリロードしてみた。
...
1回目はキャッシュがまだないので当然遅かったが、2回目にかなり早くなって成功!!簡単じゃん。
と自惚れていたら。。。

データを更新してもキャッシュが読み込まれてしまって、変更が反映されていませんでした。。
アクションキャッシュでページの更新を検知し、変更があればキャッシュを書き換える方法もあるとどこかで見ましたが、なんかめんどそうなので、今回は不採用に。




そこでもっと簡単な方法はないかと検索していると、上記3の方法がよしなに変更を検知してくれるらしいとの情報を見つけたので、試してみました(しかもgemが不必要)。

renderに cached: trueを追記

= render partial: "samples/sample", collection: @pending_relations.includes(:influencer, :campaign), cached: true

render先のviewを cache do で囲う

- cache sample do

すると、2回目の表示速度が早くなり、データ更新するとしっかりと反映されるようになりました!

Index name 'index_hoges_on_hoge_id' on table 'hoge' already existsエラーの解消法。

Index name 'index_hoges_on_hoge_id' on table 'hoge' already existsのエラーの解消法。

「indexがすでにありますよ」というエラーなので、indexを消去します。

mysqlにログインし

$ mysql -u root

databaseを指定して

mysql > use hoge

indexを削除します。

ALTER TABLE hoge DROP INDEX index_hoges_on_hoge_id;

これで解決しました。

bundle installするとAn error occurred while installing rjbのエラー。

$ bundle install --path vendor/bundler

したら

An error occurred while installing rjb (1.5.5), and Bundler cannot continue.
Make sure that `gem install rjb -v '1.5.5'` succeeds before bundling.

のエラーが出てしまいました。

エラー文の通り以下を実行すると。。

$ gem install rjb -v '1.5.5'

次はこのエラーが出ました。

ERROR:  Error installing rjb:
	ERROR: Failed to build gem native extension.
...
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

このエラー文をそのままググる

Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.

qiita.com
こんな記事を発見。

記事に記事の通りJDKをインストールし、再度bundle install

$ bundle install --path vendor/bundler

見事に成功しました。

ホワイトデーのお返し。

こんにちは〜。

昨日はホワイトデーでしたが、何か返さないとなーって1週間前くらいから考えていました。
普通にちょっといいチョコとかをお返しすればいいんでしょうが、無駄に普通じゃないものを返したくなってネットサーフィンしてたらこんなサイトを見つけました。

www.sowxp.co.jp



「モノではなく体験を送ろう」っていうフレーズにまんまと惹かれ、

カフェチケット TOKYO

を即購入しました。
これをあげれば、「一緒に行こうよ!」って言ってくれるんじゃないかっていう下心丸出しの商品です。

まだ渡していないので、喜ぶかどうか結構怪しいですが、個人的にいい買い物したと満足してしまっています。