Skip to content

Instantly share code, notes, and snippets.

@TakuyaHarayama
Last active February 19, 2018 05:47
Show Gist options
  • Save TakuyaHarayama/65f0aa1729858289a93c86a45650b7a3 to your computer and use it in GitHub Desktop.
Save TakuyaHarayama/65f0aa1729858289a93c86a45650b7a3 to your computer and use it in GitHub Desktop.
特にデザイン的な制限がなければ普通にカラム追加してattr_*使わないほうがコードがシンプルになると思いました。
# attr_writer使う場合 attr_*があいまいな人 https://qiita.com/Rudiments/items/c2c5251bcf49dfd7ce7a
# 想定される状況:DBには郵便番号は1カラムで保存されているが、表示するときに2つにしたい
# == Schema Information
#
# Table name: stores
#
# id :integer not null, primary key
# name :string(191) not null
# zip_code :string(191) not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Store < ApplicationRecord
attr_writer :upper_zip_code, :lower_zip_code
validates :upper_zip_code, presence: true
validates :lower_zip_code, presence: true
# DBのカラムはzip_codeのため、upper_zip_codeとlower_zip_codeをバリデーションの前に結合させて、設定しておく必要がある
before_validation :set_zip_code
def upper_zip_code
@upper_zip_code || zip_code[0..2] if zip_code.present?
end
def lower_zip_code
@lower_zip_code || zip_code[3..6] if zip_code.present?
end
def set_zip_code
return if @upper_zip_code.blank? || @lower_zip_code.blank?
self.zip_code = [@upper_zip_code, @lower_zip_code].join
end
end
# カラム追加する場合
# 想定される状況:表示するときは2つ
# == Schema Information
#
# Table name: stores
#
# id :integer not null, primary key
# name :string(191) not null
# upper_zip_code :string(191) not null
# lower_zip_code :string(191) not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Store < ApplicationRecord
validates :upper_zip_code, presence: true
validates :lower_zip_code, presence: true
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment