/murasaki_shikibu

string typecaster

Primary LanguageRubyMIT LicenseMIT

MurasakiShikibu

Build Status

MurasakiShikibuは、表記ゆれ問題解決のために、名寄せを行うことを目的としているgemです。

  • 住所を全角数字で統一したい
  • 名前は大文字に統一したい

など、DBへの保存前にフォーマットを統一するような用途を想定しています。

before callback などでもDB保存前の変換は可能ですが、変換後のvalueで検索するにはwhere文やfind_by文のたびに、明示的に変換する必要があります。

MurasakiShikibuでは、

attribute :name, MurasakiShikibu::Type.new { |name| name.capitalize }
# https://apidock.com/rails/ActiveRecord/Attributes/ClassMethods/attribute

# Or

include MurasakiShikibu

murasaki_shikibu :country do |country|
  country.upcase
end

といった記述をすることで、 保存前のフォーマット変更 検索文字列のフォーマット変更 を統一で行います。

gem名は、校了や清書といった文学っぽいイメージから、日本を代表する作家・歌人から名付けています。

Installation

Add this line to your application's Gemfile:

gem 'murasaki_shikibu'

And then execute:

$ bundle

Or install it yourself as:

$ gem install murasaki_shikibu

Usage

class User < ActiveRecord::Base
  attribute :name, MurasakiShikibu::Type.new { |name| name.capitalize }
  attribute :address, MurasakiShikibu::Type.new { |address| address.tr('0-9a-zA-Z', '0-9a-zA-Z') }
end

# Or if want to use DO-END

class User < ActiveRecord::Base
  include MurasakiShikibu

  murasaki_shikibu :name do |name|
    name.capitalize
  end
  murasaki_shikibu :address do |address|
    address.tr('0-9a-zA-Z', '0-9a-zA-Z')
  end
end


user = User.new(name: 'ryoff', address: '東京1-2-3')
user.name    # Ryoff
user.address # 東京1-2-3

User.new(name: 'ryoff', address: '東京1-2-3').save

User.where(name: 'ryoff').first.name # Ryoff
User.find_by(name: 'ryoff').name     # Ryoff

User.where(address: '東京1-2-3').first.address # 東京1-2-3
User.find_by(address: '東京1-2-3').address     # 東京1-2-3
class Bank < ActiveRecord::Base
  attribute :name, MurasakiShikibu::Type.new { name.upcase.tr('A-Z', 'A-Z') }

  # Or

  include MurasakiShikibu

  murasaki_shikibu :name do |name|
    name.upcase.tr('A-Z', 'A-Z')
  end
end

Bank.where(name: '三菱東京UFJ銀行').first.name    # 三菱東京UFJ銀行
Bank.where(name: '三菱東京UFJ銀行').first.name # 三菱東京UFJ銀行
Bank.find_by(name: 'SMBC信託銀行').name     # SMBC信託銀行
Bank.find_by(name: 'smbc信託銀行').name     # SMBC信託銀行
Bank.find_by(name: 'SMBC信託銀行').name # SMBC信託銀行

License

The gem is available as open source under the terms of the MIT License.