RoRで指定時間が過ぎたのに処理が行われなかった対応メモ。

しばらくRuby触ってなかったので焦りました。

というか1年以上誰も気づいていなかったバグ。

意外と見落としがち対応メモ。

現象

お知らせ表示開始時刻を過ぎてもお知らせのタイトル2が表示されない場合がある。

リロードすると表示されることもある。

タイトル1に関しては常に表示されている。

環境

  • OS: CentOS release 5.5 (Final)
  • LB: 不明
  • Web Server: Apache/2.2.3
    • 4台
  • DB: Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (x86_64) using readline 5.1
    • Master 1台
    • Slave 2台
  • Ruby: 1.8.7
  • Ruby on Rails: 3.2.6

ソース と データ

app/models/info.rb
1
2
3
4
class Info < ActiveRecord::Base
# 公開中のものを取得
scope :active, where(["start_date <= :time AND end_date >= :time", {:time => Time.now}])
end
app/controllers/info_controller.rb
1
2
3
4
5
6
class InfoController < ApplicationController
def index
# 公開中のお知らせ取得
@infos = Info.active.page(params[:page])
end
end
app/views/info/index.html.erb
1
2
3
4
5
<ul>
<% @infos.each do|info| %>
<li><%= info.title %></li>
<% end %>
</ul>

info テーブルのデータ

idtitlestart_dateend_date
1タイトル12013-03-14 00:00:002013-03-10 00:00:00
2タイトル22013-03-15 00:00:002013-03-31 00:00:00

原因

調査の結果、Webサーバ A、B、C、Dの4台のうちA、B、Dは正常に表示されているが、Webサーバ(C)のみタイトル2が表示されてないことがわかった。

本番のproduction環境の場合、Modelは一度しか読み込まれない。

その際、Model内にTime.nowなどの記述があると、その読み込み時刻が反映される。

つまり、今回のソースの場合、socpeで利用しているTime.now:timeの値が次回サーバ再起動時まで固定となってしまうため、読み込みのタイミングが悪かったWebサーバ(C)のみ表示されないという事象が発生した。

ちなみに、development環境下の場合、都度読み込みになるので今回のバグは発生しないようです。

対応内容

下記のスライド内のCase2を参考に修正した。

実録!Railsのはまりポイント10選

lambdaで渡せばいいとのこと。

app/models/info.rb
1
2
3
4
class Info < ActiveRecord::Base
# 公開中のものを取得
scope :active, lambda{where(["start_date <= :time AND end_date >= :time", {:time => Time.now}]) }
end

無事表示できるようになりました。

当時のログを見直すと同じ修正を他のところでしてたみたいなので、その時の対応漏れっぽい。

これを機に他のソースも見なおしてみます。

以上です。

ラーメン食べてきた。

お腹が減ったら食べる。どうも何某です。こんばんは。

何度もダイエット成功してるから大丈夫。怖くない。

ラーメンが食べたくなったので、ネットで評価の高いつけ麺屋に行ってみる。

客は、僕とほぼ同じに入ったカップルと先客の男性の計4人。

厨房に男性が1人。いらっしゃいませの声からおそらく中国の方と思われる女性がホールに1人。

無難なつけ麺を注文。

待っている間暇なので左隣のカップルの会話に聞き耳を立ててみた。

まぁ、カウンターだけの狭い店内なので、何もしなくても全員に会話が聞こえるのだが。

男「どういう男がタイプなの?」

女「目が細い一重の人がめっちゃくちゃ好きなのね。二重の目パッチリの人が顔近づけてきても全然ドキドキしないのよー!!」

偶然にも僕の目は一重で細い。もしやこの女俺に気があるのか?

喋り方はいささかイラつく感じだが、黙っていれば黒髪が綺麗な清楚な目パッチリのまずまずの美人だ。

これは有りだな。

などと考えながら男を見ると、僕以上に目が細かった。

女「そっちはどんな人がタイプなの?」

男「肩までくらいの黒髪で目が二重で大きい子かな。」

女「えー、私じゃーん。うふふふー。」

茶番だ。

あぶない。完全に噛ませ犬になるところだった。

一瞬でも今夜はイケると思った自分を恥じる。

話の流れからまだ付き合ってはないようだが、まぁ時間の問題だろうなという感じ。

好みのタイプでお互いの容姿をそのまま言い合うなんてもう付き合ってるようなもんだろう。

完全に男はいけると思ってる顔してる。

僕と”カップル”につけ麺が運ばれて来ると同時に、僕の右隣に座っていた男性は席を立つ。

中国人の女性店員が丁寧に片付ける。

女「今日店長に告られちゃってぇ〜。」

男「えっ?」

女「どうしようかと思ってさぁ〜。」

雲行きが怪しくなってきた。

男「働いてるとこの店長だよね?店長って結婚してるよね?」

女「子供もいるのよね。だからどうしたらいいのかなと思ってぇ。」

穏やかじゃない。

いつもは豪快にラーメンをすする僕も、今日ばかりは静かに箸をたぐり寄せる。

しかし、考えればまぁよくある手だ。

男の気を引くために、告られただと気になるっぽい人が出来ただの。

この女、だいぶしたたかだな。

男の顔を見ると、完全に焦っている。

箸は全く進まず、口がパクパクいっている。

女が1人つけ麺食べながら、店長がどんな人で、どういう状況で言われただの勝手に喋っている。

すると男が急に

男「そんな妻子持ちの店長なんかやめて俺と付き合おうよ。」

まさかのラーメン屋で告白。

いや、流れ的にここで言うのも有りか。

カウンターを拭く中国人店員の手がゆっくりになっている。

女「もぉー。冗談ばっかりー!ダメよそういう冗談言っちゃー。」

男「いや、本気なんだよ。ずっと好きだったんだって。」

女「ほんとー!?ありがとー!!すごい嬉しい!!」

男「そんな店長より俺のほうが愛してる。。。本気だよ。。。」

女「。。。。」

男「そんな妻子持ちやめなよ。俺と付き合って。」

女「ん。。。ちょっと。。。私にはその気はぁ。。。無いかなぁ。。。」

女店員「えっ!!!!!?????」

大声で驚く中国人女性店員。一斉に全員が女性店員を見る。

僕の文才が無いから伝わらないかもしれないが、二人の会話、表情から言えば付き合うものと思える感じだったのだ。

驚くのもわからんでもない。いや、僕、店員2人、そして男。女以外の店内にいる全員が想定外の言葉に驚いてた。

女店員「あ。。。え。。。あ。。。すみません。。。」

女「なんかごめんね。そういうつもりじゃなかったから。なんか。」

男「いや、え。。。はははは。。。まぁ。。。ねぇ。。。」

凄い微妙な空気。男の目が完全に泳いでる。

もう早く食べて帰ろう。自分がフラれるのも辛いが他人がフラれるのを見るのも辛い。

結局、黙々と食べる2人を横目にサクッと帰りました。

肝心のつけ麺の味は普通だった気がする。

以上です。

ダイエット中。

急に暖かくなったからなのか体調おかしい。こんばんは。何某です。

美味いものばっかり食べてたらびっくりするほど太ったので、去年の9月〜12月までの毎日5kmのウォーキングして、1月からジョギングに切り替えた。

当初2km走るのもきつかったのに、今ではゆっくりながらも10km以上走れるようになった。

体重も相当減ったけど、まだまだ標準には遠いのでこの調子で続けていこうと思います。

以上です。

© 2024 磁力式駆動 All Rights Reserved.
Theme by hiero