ActiveRecordで、全部のモデルのstring型等に共通のvalidateを追加する
postgresでstring型だと255文字までしか入力出来ないので、255文字をMAXとするとか、
コーディング規約で必須になる名称を_nameという名称で統一するとかやりたかったので
こんなコード書いた。
module ActiveRecordValidate def after_initialize @@load_validates ||= [] return if @@load_validates.include?(self.class) @@load_validates << self.class attributes.each do | self_attribute | eval_expr = "" self_column = column_for_attribute(self_attribute) next if self_column.nil? || self_attribute.blank? if self_attribute =~ /_name$/ eval_expr += "validates_presence_of :#{self_attribute}\n" end if self_column.type == :string eval_expr += "validates_length_of :#{self_attribute}, :allow_blank => true, :maximum => 255\n" end self.class.class_eval eval_expr unless eval_expr.blank? end end end class ActiveRecord::Base include ActiveRecordValidate end
インスタンス生成毎に読み出すのが凄い駄目。
ActiveRecord::baseを継承したクラスを宣言したタイミングで実行したいんだけど、
何かそういうフックは無い物か・・・・。