質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

1161閲覧

railsのbelongs toについての質問です

drizzing20

総合スコア363

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/10/13 14:22

belongs_to :admin_user, :class_name => "User"
のようにbelongs_toに クラス名を書くのは具体的にどんなことをしたいときか教えてください。リファレンスを読んだのですがどう使うのかいまいち理解できません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Book モデル(クラス) と User モデル(クラス) があってこれを関連付ける際、通常は

ruby

1class Book 2 belongs_to :user 3end

とします。

belongs_to は 1番目の引数を関連先のクラス名として扱いますので、引数の :user

ruby

1:user.to_s.classify # => "User"

で変換され、無事 User モデル(クラス)と関連付きます。


さてここで、この関連を実際に使う場合を考えてみましょう。

ruby

1book.user

ではしっくりこず

ruby

1book.admin_user

の方がしっくりくるなぁと思ったとします。

book.admin_user と書くには 関連名は admin_user にする必要があります。

ruby

1 belongs_to :admin_user

すると、先のとおり belongs_to は 1番目の引数を関連先のクラス名として扱いますので

ruby

1:admin_user.to_s.classify # => "AdminUser"

という事で AdminUserモデル(クラス) との関連付けになります。

いやー。AdminUserモデル(クラス) じゃないんだよ モデル(クラス) は User のままでいいんだよ。。。。

(´・ω・`)ショボーン

Railsつかえねーなー。

という時に class_name: オプションを使って

ruby

1class Book 2 belongs_to :admin_user, :class_name => "User" 3end

class_name を明示的に指定してあげる事により :admin_user => AdminUser という変換がスキップされ最初から関連先のモデル(クラス)は Userモデル(クラス) という事になり

ruby

1book.admin_user

Userモデル(クラス) のオブジェクトを取得する事ができます。


has_one, has_manyclass_name: オプションも同じ意味です


質問のタイトルは「railsのbelongs toのclass_name:オプションの使い道」がより適切だと思います。

投稿2016/10/14 01:22

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

通常ですと、関連名から関連相手のクラスのオブェジエクト名を生成できるので、class_nameの指定は不要です。
admin_userなどの、デフォルト以外の任意の名前を関連名にしたい場合に使います。

そちらのコードを拝借した例で話すと、

ruby

1class Book < ActiveRecord::Base 2 belongs_to :admin_user, :class_name => "User" 3end

のようなBookモデルがある時に、

ruby

1book = Book.first 2book.admin_user

のように使いたい時にはクラス名を別途指定する必要があるのです。

クラスネームを指定しない場合、Userモデルとのアソシエーションは以下のようになり、

ruby

1class Book < ActiveRecord::Base 2 belongs_to :user 3end

ruby

1book = Book.first 2book.user

のように使うことになります。

参考までに、

Railsガイドには、

関連名から関連相手のオブジェクト名を生成できない事情がある場合、:class_nameオプションを使用してモデル名を直接指定できます。

とあります。

参考
http://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-class-name

投稿2016/10/13 14:36

編集2016/10/14 00:09
cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問