webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

今日学んだこと。日時の比較やalias_methodなど

こんにちは、エンジニアのさもです。

今回は今日学んだことを忘れないようにするためのメモです。

スポンサーリンク

[Ruby]文字列と日時の比較

間違った実装をしていました。

こんな感じです

user.applied_at.strftime("%Y-%m-%d 11:00:00") < Time.zone.now

ちょいちょい前から、時刻がずれているような気がするみたいな報告があったようなので、調査したところ、

上のコードのように、左辺は日時を文字列にしたものなのに対し、右辺はタイムゾーン有りの日時です。正しく比較するには、以下のようにする必要がありました

user.applied_at.strftime("%Y-%m-%d 11:00:00 +0900") < Time.zone.now

日本のタイムゾーンを追加しました。でも、タイムゾーンを直書きっていやですよね。なので、タイムゾーンクラスにパースしました。

Time.zone.parse(user.applied_at.strftime("%Y-%m-%d 11:00:00")) < Time.zone.now

[Ruby]alias_method

仕様の中で、管理画面からの登録は日付だけど、比較や画面への表示は11時にして欲しいというカラム(日時型)がありました。

今までは画面やコントローラ等で毎回strftimeを呼んで11時と指定していたのですが、一部で23時になっていたり、10時になっている実装を見つけたので、モデルで一括管理することにしました。

そこで使ったのがalias_methodです。

class User
  alias_method :ori_applied_at, :applied_at

  APPLY_TIME = "11:00:00"

  def applied_at
    Time.zone.parse(ori_applied_at.strftime("%Y-%m-%d #{APPLY_TIME}"))
  end
end

これで、普通にuser.applied_atとするだけで11時に揃えられた値が取得できます。

[CSS] inherit

デザイナーさんの書いたcssで良く見るなーと思っていて、調べてみました。

inheritをつけると、親要素のスタイルを引き継げるそうです。

<style>
  div.test_inherit_parent {
    border-bottom: double 10px #0000ff;
  }
  p.test_inherit_child{
    border-bottom: inherit;
    padding-bottom: 3px;
  }
</style>

<div class="test_inherit_parent ">
  <p class="test_inherit_child">aaaa</p>
</div>

-------------------------[実行結果]-------------------------

aaaa

--------------------[実行結果ここまで]------------------------------

長い青線がdivのボーダーで、短いのが継承したpタグのボーダーです。

[Jquery]eq(position)

jQueryで指定したポジション(上から何個目か)の要素を取ってくるセレクタです。参考

こいつには本当に悩まされました。

ある画面で横並びのテーブルがあったのですが、左のテーブルのある行をクリックしたら、右のテーブルの同じ行の背景色を変えるという動作がjQueryにて書かれていました。右のテーブルというのを、$("table").eq(1)のように書いてありました。

これはこれでうまく動いていたのですが、ある改修をしてから、突然動かなくなりました。

ある改修とは、「元々あったテーブルの上部に別のテーブルを追加する」ことです。

うまく動いていたときは、左のテーブルがpositionが0, 右のテーブルのpositionが1となっていたのですが、テーブルを追加したことにより、

追加したテーブルのpositionが0、左のテーブルのpositionが1、右のテーブルのpositionが2となったため、正しく動作しなくなりました。

eqでの指定をやめて、普通にidで指定するようにしました。ちゃんちゃん

以上、今日学んだことでした。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。