ActiveRecord::Store 便利

 ActiveRecord で、条件によってカラムが変わったりするのを serialize した列にテキトウにぶっ込んでおくというありがちな実装の時に、実カラムのように透過的に扱えて validation とかも簡単にかけられる ActiveRecord::Store ちゃん便利。

 例えば、SNSのアカウントを sns_accounts 列に Serialize して入れる場合(普通入れないが…)

ActiveRecord::Store を使わない時

class User
  serialize :sns_accounts, Hash
end

とかして、以下のような感じにします。

user = User.new
user.sns_accounts = {twitter:'ecpplus', github:'ecpplus'}

ActiveRecord::Store を使った時

class User
  store :sns_accounts, accessors: [:twitter, :github]
end

としておけば、下記のような感じに出来ます。

user = User.new
user.twitter = 'ecpplus'
user.github = 'ecpplus'

validation したい時も特に何も考えず、通常の列と同じようにすればOKです。

class User
  store :sns_accounts, accessors: [:twitter, :github]
  validates :twitter, presence:true
  validates :github, presence:true
end

Controller から使う時は、Strong Parameters で permit してあげるのを忘れないであげてね!

params.require(:user).permit(:twitter, :github)
ActiveRecord::Store 便利