There's an echo in my head

日々のメモ。

activerecord

素のオブジェクトをfields_forに使う

例えばモデル的にGraph has_many Entityだけど、GraphはActiveRecordを使う一方でEntityには素のオブジェクトを使いたい場合。データストアが異なるとか。 class Graph < ActiveRecord::Base after_save :save_entities def entities @entities ||= [] # TOD…

accepts_nested_attributes_forを多段で使う

複数の関連を跨いでaccepts_nested_attributes_forを使う場合の話。 たとえば Organization has_many Groups Group has_many Employees というモデルに対して、1度にまとめてこれらのレコードを作成したい場合には次のようにする。 まずはクラスの定義: clas…

ActiveRecordのserializeはYAML以外の読み書きにも使える

serialize-rails gemでJSONをDBに格納するという記事を書いたけど、わざわざgemを使わなくても第2引数に渡すオブジェクトがloadとdumpを実装していれば十分だった。ちなみにActiveRecord 3.2で確認。 たとえばURLをURIのオブジェクトとして扱いたい場合。 # …

ActiveRecordのwith_lockはトランザクションも開始してくれる

ソースを見るとトランザクションを開始してからロックしてくれるので、別途transactionを呼ぶ必要はない。 # File activerecord/lib/active_record/locking/pessimistic.rb, line 69 def with_lock(lock = true) transaction do lock!(lock) yield end end …

serialize-rails gemでJSONをDBに格納する

ActiveRecordのserializeはYAMLにしか対応していないけど、serialize-railsを使うとJSONやXML、RubyのMarshalも保存できるようになる。 # Gemfile source 'http://rubygems.org' gem 'rails', '3.2.9' # 3.0.0 以上が必要 gem 'serialize-rails' # app/model…

has_one, has_many, belongs_toでconditionsを動的にする

Rails has_many with dynamic conditionsより、ActiveRecord 3.1+ではprocを使う必要があるみたい。3.2.8で確認済み。 class User has_many :pictures has_one :profile_picture, class_name: "Picture", foreign_key: "user_id", conditions: proc { ["id =…

schema_plusで外部キー制約をかける

schema_plusを使うとcreate_tableやadd_columnでカラムを定義するときに:referencesオプションにテーブル名を渡すだけで、外部キー制約を手軽にかけることができる。 create_table :posts do |t| t.integer :category_id, references: :categories end 個々…

ActiveRecord::Baseにfindとかfirstっぽいメソッドを生やす。

Rails 3.2.8の話。ActiveRecordは長いのでARと略す。 findやfirstの実装自体はAR::FinderMethodsで定義されていて、それをincludeすることでAR::Relationのインスタンス(user.postsとかUser.scopedの返り値)から使えるようになっている。 module AR::Finde…

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。