baronyan's blog

linux,macでruby、railsでの開発をしていく中で知ったこと、備忘的なことなどを書いていきます。

railsでDateクラスを検索条件に使う方法

railsActiveRecordでdatetime型を検索する場合、検索条件には
TimeインスタンスActiveSupport::TimeWithZoneインスタンスが指定できます。

日付の区切りを指定したい時などにDateインスタンスを条件に使えると便利なのですが、
こちらはActiveRecordの検索条件としては許容されていません。

ですが、

Date.today + 0.hours

といった具合に、時分秒を増減することで、
ActiveSupport::TimeWithZoneへの型変換が行われ、
検索条件に使えるようになります。

余談ですが、railsはdatetime型に保存する時はutcで保存する流儀ですが、

Time.now.utc

というようにutcメソッドを呼ぶことで、簡単に、
utcに変換した値を検索条件として使うことができます。

utcで保存しているDATETIMEカラムの中身をJST(Tokyo)で表示する方法

.in_time_zone('Tokyo')
を使って都度JSTに変換します。

Book.updated_at.in_time_zone('Tokyo').to_s

rails上でカラムの型を取得する

Bookを、booksテーブルを表すActiveRecordモデルだとすると、

Book.columns_hash['isbn'].type

で、isbnカラムの型を取得できる。

戻り値はシンボルで、

:string
:integer
:float
:datetime

などがある。

【正規表現】否定先読みと否定戻り読みを使って、重複なく、同一文字が続く箇所を指定する

「t」が3文字以上続く箇所のみをピックアップする例

(?<!t)t{3,}(?!t)

単純に
t{3,}
だと、
tttt
という文字列の1文字目から始まる「tttt」と2文字目から始まる「ttt」の両方にヒットしてしまう

ActiveRecordeのwhereメソッドでlikeを使う

Book.where('tag = ?', tag_b)

これを↓こうするとlikeが使えます。

Book.where('tag like ?', "%#{tag_b}%")


Book.where("tag like '%?%'", tag_b)
とか
Book.where('tag like ?', tag_b)
とかだと動きません。


直感的じゃないのでwhere以外で実現した方が良いかもしれません。