へろへろもへじ

(ブログタイトル募集中)

loose_attrというActiveRecordを拡張するgemをリリースしてました

去年の年末にloose_attrというActiveRecordを拡張するgemをリリースしてました。

github.com

ActiveRecordを拡張するgemは初めて書いたのですが、リリースして満足してしまいREADMEも整備せずに放置してたので、重い腰を上げて整備しました。合わせてブログでもリリースノートとして残しておこうと思います。

何をするものか

JSON形式の文字列としてカラムに保存...いわゆるシリアライズLOBパターンの利用時に、loose_attrを導入すると、JSONのkeyに対しmodelのプロパティとしてアクセスが可能になります(動的にアクセスメソッドを生成しています)

SQLiteMySQLでしか動作確認してませんが、PostgreSQLでもたぶん動くはず。json型は...(動かなかったらPRお願いします:bow:)

作った経緯

JSONをHashに変換して、値を取得してパースして...という作業を各々がゴニョゴニョするのではなく、共通的に(ActiveRecordで)吸収したかったので。コードはRuby界隈で有名なonkさんのshibarakuというgemをパクリ参考にさせて頂き、テストはマネーフォワードさんの、以下の記事を参考にさせて頂きました。

ActiveRecordを拡張するgemでテストを書くには? | Engineers' Blog

この場を借りてお礼申し上げます :pray:

使い方

1. Gemfileに以下を追記し、gemをインストールします
gem 'loose_attr'
2. JSON形式で保存するためのカラムを用意します(デフォルトではext_fieldという名前のカラム)
3. 対象のmodelクラスに以下のように設定します

ext_fildに保存するjson

{
    "comment_count": 100, 
    "user_name": "retz",
    "posted_at": "2016-03-11 00:00:00"
}

Post(仮)というクラスに導入するための設定をしてみます

class Post < ActiveRecord::Base
  loose_attr :comment_count,  default_value: 1
  loose_attr :user_name,   default_value: 'noname'
  loose_attr(
    :posted_date,
    cast_type: :date,
    default_value: '2016-01-01',
    option: { format: '%Y年%m月%d日' }
  )
end
4. これでjsonの各値に以下のようなアクセスが可能になります。
Post.create!(
  id: 1,
  body: 'hogefoobar',
  category: :it,
  actived: true,
  ext_field: {
    comment_count: 10,
    user_name: nil,
    posted_at: '2016-03-11'
  }.to_json
)

post = Post.find(1)
puts post.body #=> hogefoobar
puts post.category #=> it
puts post.comment_count #=> 10
puts post.user_name #=> noname
puts post.posted_at #=> 2016年03月11日

保存(create, update, save)する際にも、gem側でJSONシリアライズするので時に意識せずにOKです。

その他、詳細はGitHubのREADMEをご参照ください。

さいごに

Issue、PRお待ちしてます!よろしければstarもお願いします!