English version: simple_master_columns_en.md
SimpleMaster のカラムは def_column で定義し、ロード時に型変換・キャッシュ・補助メソッドを自動生成します。
type や各種 DSL によって、変換ルールや追加メソッドが決まります。
class Weapon < ApplicationMaster
def_column :id
def_column :name, type: :string
def_column :attack, type: :float
def_column :rarity
enum :rarity, { common: 0, rare: 1, epic: 2 }
end- 例:
def_column :attack, type: :float - 対応タイプは「カラムタイプ別一覧」を参照してください。
- 例:
def_column :lv, type: :integer, group_key: true - もしくは
group_key :lvでも指定できます。
- DB 側のカラム名が異なる場合に使います。
- 例:
def_column :start_at, type: :time, db_column_name: :start_time
- 言語による差分が定義でき、
I18n.localeに応じた値を返すようになります。 - 例:
def_column :name, globalize: true - もしくは
globalize :nameでも指定できます。 @_globalized_nameに翻訳文が{ en: "Storm Edge", ja: "ストームエッジ" }のように入ります。id/enum/bitmask/sti/polymorphic_typeでは利用できません。group_keyとは併用できません。
指定方法
def_column :id挙動
- 代入時に
to_iで変換。 - テスト用の更新時に
id_hashを再構築するための処理が入ります。
指定方法
def_column :lv, type: :integer挙動
- 代入時に nil 以外は
to_iで変換されます(空文字はnilに)。
指定方法
def_column :attack, type: :float挙動
- 代入時に nil 以外は
to_fで変換されます(空文字はnilに)。
指定方法
def_column :name, type: :string挙動
- 代入時に nil 以外は
to_sで変換されます。 - メモリ節約のために、オブジェクトはキャッシュされ、同じ値ならオブジェクトは流用されます。(object_cache)
指定方法
def_column :kind, type: :symbol挙動
- 代入時に nil 以外は
to_s+to_symで変換されます。 - SQL/CSV 用には文字列として出力されます。
指定方法
def_column :is_boss, type: :boolean挙動
Integerは 0/1、Stringは "true" / "1" で判定。name?のメソッドが追加されます。- SQL/CSV 出力時は 0/1 に変換されます。
指定方法
def_column :info, type: :jsonオプション
symbolize_names: trueを指定すると JSON 文字列をシンボルキーに変換します。
挙動
- 文字列の場合は
JSON.parse。 - SQL/CSV 出力時は
JSON.generateで文字列化されます。 - 注意点: 文字列以外の代入は、
symbolize_namesによるキー変換は行われません。
指定方法
def_column :start_at, type: :timeオプション
db_type: :timeを指定すると時刻だけの形式 (HH:MM:SS) で出力します。
挙動
- 文字列を
Date._parseで解析してTimeに変換します。 - 小数秒は切り捨てられます。
指定方法
def_column :rarity, enum: { common: 0, rare: 1, epic: 2 }
# or
def_column :rarity
enum :rarity, { common: 0, rare: 1, epic: 2 }オプション
prefix,suffix: 述語メソッドに prefix / suffix を付けられます。prefix: trueでrarity_common?のようになります。suffix: :rarityでcommon_rarity?のようになります。
挙動
- 値は
Symbolとして扱われます。 raritiesクラスメソッドとrarity_before_type_castが追加されます。- 述語メソッド (例:
common?) が自動生成されます。
指定方法
def_column :flags, type: :integer
bitmask :flags, as: [:tradeable, :soulbound, :limited]挙動
- 配列/シンボル/整数を受け取り、内部では整数ビットに変換します。
flagsはシンボル配列として返ります。flags_value/flags_value=が追加されます。ビット列の数値が返ります。
指定方法
def_column :type, sti: true挙動
typeを文字列に変換します。- Loader 側で
typeを見てクラス分岐する運用になります。 sti_base_classとsti_columnが定義されます。
指定方法
def_column :reward_type, polymorphic_type: true挙動
belongs_to polymorphicのタイプカラムとして使います。reward_typeを文字列として保持し、reward_type_classを自動で設定します。- 空文字は
nilに変換されます。
独自のカラム型を追加する場合は SimpleMaster::Master::Column を継承します。
クラス名の末尾が Column であれば、自動で type が登録されます。
class MoneyColumn < SimpleMaster::Master::Column
private
def code_for_conversion
<<-RUBY
value = value&.to_i
RUBY
end
def code_for_sql_value
<<-RUBY
#{name}
RUBY
end
end
# 利用側
class Product < ApplicationMaster
def_column :price, type: :money
end- カスタムカラムのファイルはロード対象に含めてください。
initをオーバーライドすると、独自メソッドの生成も可能です。- 詳しくは lib/simple_master/master/column.rb 定義ファイルを直接ご覧ください