[quads id=1]
今回はモデル名を直接指定することができるclass_nameオプションについてまとめたので紹介したいと思います。関連付けの相手となるオブジェクト名を関連付け名から生成できない事情がある場合に役立つオプションになります。
この記事の内容
class_nameとは
class_nameとは、関連名と参照先のクラス名を異なるものに置き換えることができるオプションです。関連付けの相手となるオブジェクト名を関連付け名から生成できない事情がある場合に役立つオプションになります。
例を見てみます。
以下のようにUserとPostが1対多の関係で紐づいているとします。
class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
end
この場合、post.user
と記述することで1つの投稿(post)に紐づいたユーザー(user)を取得することができます。
post.user
=> postに紐づいたユーザーを取得できる
しかし、関連付けの相手となるオブジェクト名を関連付け名から生成できない事情出てくる場合があります。このような場合に使えるのがclass_nameオプションになります。
以下のようにclass_nameを付与することでモデル名を直接指定できるようになり、post.owner
でも投稿に紐づいたユーザーを取得することが可能になります。
class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
end
post.owner
=> postに紐づいたユーザーを取得できる
まとめ
- class_nameとは関連名と参照先のクラス名を異なるものに置き換えることができるオプション
- class_nameは関連付けの相手となるオブジェクト名を関連付け名から生成できない事情がある場合に役立つオプション
参考
今回はモデル名を直接指定することができるclass_nameオプションについて紹介しました。関連付け周りは痒いところにも手が届くオプションが多々あり調べてみると面白いかもしれませんね。