There's an echo in my head

日々のメモ。

schema_associations gem

RDBMSのテーブルスキーマから自動的にリレーションを識別してActiveRecordのモデル間の関連付けを行なってくれるというもの。これを使えばhas_onehas_manybelongs_toによる宣言を行う必要がなくなる。

ActiveRecordのログを見ると、どのように識別されているかが書きだされている。

[schema_associations] Post.has_one :comment, :class_name=>"Comment", :foreign_key=>"post_id"

ただし"one-to-one"と"one-to-many"の親側は自分が単一の子を持っているのか、それとも複数の子を持っているのかが外部キー名からのみでは判断できない。このため、has_oneによる"one-to-one"のリレーションの場合には外部キーにユニークインデックスをはるか、もしくは通常通りhas_oneで宣言をする必要があるので要注意。

# Post has_one Comment

create_table :posts do |t|
end

create_table :comments do |t|
    t.integer post_id, :index => :unique    # (using the :index option provided by schema_plus )
end

class Post < ActiveRecord::Base
    # has_one :comment
end

class Comment < ActiveReocrd::Base
    # belongs_to :post
end

参照

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