Modelのリレーション
で、UserというModelに対してSocialAccountというModelを紐付けていますが、UserとSocialAccountをuser_idというカラムを利用することでリレーションさせています。前項
UserというModelのidに対して、SocialAccountというModelのuser_idが1対1なのでhas_oneとbelongs_toという関係が成り立ちます。
この関係性が成り立つ場合に、下記の様な記述でUserというModelからSocialAccountというModelを参照することができます。
※参照する際は、Model名をスネークケースで記述します。
上記コードの結果として、Googleに登録した名前が表示されます。
また、逆にSocialAccountというModelからUserというModelを参照することも可能になります。
paccount.user.name
上記コードの結果として、UserというModelに登録された名前が表示されます。
・has_manyについて
has_oneとbelongs_toについては学習しましたが、has_manyとbelongs_to
例えば、ユーザーが記事を投稿する際、ユーザー1名に対してそのユーザーが投稿した記事は複数紐づくことになります。この場合、ユーザーと投稿は1:nの関係になります。
ユーザーの投稿する記事をPostというModelとした場合に、UserというModelはPostというModelを複数持つため、has_oneではなくhas_manyになります。Post側は、UserというModelに属している形なのでbelongs_toになります。
has_manyとbelongs_toの実装方法として、1:nのn側のModelに紐づくテーブルのカラムに参照先のModelのIDを持たせる必要があります。
例えば、UserというModelとPostという投稿記事情報を表すModelが存在し、それらの関係が1:nだったとします。
User : Post = 1 : n
この場合、UserというModelには、has_many:postと記述し、PostというModelにはbelongs_to:userという記述が必要になります。そして、PostというModelはUserというModelに属しているため、UserというModelのIDを保持しなければいけません。このIDを外部キー
・外部キーの定義の仕方
外部キーを定義する際は、参照先のModel名(スネークケース)+_idとして定義する必要があります。
例:
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.integer :user_id
t.string :title
t.text :post_text
t.timestamps null: false
end
end
end
上記コードは、記事情報を持つModelを作成する際のマイグレーションファイルの例です。作成する際にinteger(数値型)でuser_idと定義しています。これは、PostというModelがUserというModelを参照する際に使用する外部キー
外部キーを定義し、has_many、belongs_toを記述することでRubyonRailsが自動的に、関連性を担保してくれます。
下記のコードで1:nの関係性を持つModelを参照することができます。
※参照する際は、Model名を複数形にしたスネークケースで記述します。
user.posts
逆に、下記のように記述することでPostからUserというModelを参照することもできます。
ppost.user.name
上記のコードの結果として記事を投稿したユーザー名が表示されます。
Modelをリレーションさせた際に使用できるメソッド#作成user=User.create(name:“レイルズ”)#記事情報を作成(buildを行うことで、UserというModelと関連性を持つ記事情報を作成する)post=taro.posts.build(title:“記事のタイトル”)#記事情報を保存するpost.save#2つ目の記事を作成し保存する(createを行うことで、作成&保存を行う)post2=user.posts.create(title:“記事その2”)#リレーション#記事情報を配列で取得するuser.posts#記事情報の存在確認(存在すればtrueしなければfalse)user.posts.exists?#記事情報が存在確認2(存在しなければtrue存在すればfalse)user.posts.empty?#記事情報が属しているユーザー情報を取得(単数形である点に注意)post.user#記事のidが1のものを取得user.posts.find(1)#記事タイトルで検索user.posts.find_by(title:“記事その2”)#記事タイトルであいまい検索title=“その2”user.posts.where(“titlelike?”,“%#{title}%”)#記事数を取得Posts.count#削除post.destorypost2.destory
・TRYユーザーの記事投稿機能を作成してみましょう
『作って学ぶRubyonRailsシリーズ』で学習してきたことを生かし、ユーザーの記事投稿機能を作成してみましょう。(ブログやSNSのイメージ)
見た目の部分(CSSや画像等)のデザインは要件には含めないため、自由にデザインして下さい。
要件は下記になります。
・タイトルをつけられる
・記事本文(文字数制限は特にありません)
・記事に画像を1つ以上投稿できる。
・ページ内に記事の投稿ボタンが表示されており記事の投稿ページへ遷移できる。
・各記事の、タイトル、投稿者名、投稿日時が一覧表示されている
・一覧表示は、投稿日時が現在日時と近い記事から順に表示されている。
・一覧表示はページネーションにより、1ページに表示する件数が決まっている。
※表示件数は任意
・各記事のタイトルをクリックするとその記事の詳細ページが表示される。
・各記事の投稿者名をクリックするとその投稿者のプロフィールが表示される。
・記事の投稿者がログインしている自身のユーザーであれば、編集ページへのリン
クが表示されている。
・記事の投稿者がログインしている自身のユーザーであれば、削除ボタンが表示さ
れており、削除することができる。
・タイトル、投稿日時、投稿者名、記事本文、記事の画像が表示されている。
・一覧へもどるボタンが存在する
・投稿者名をクリックするとその投稿者のプロフィールが表示される。
・記事の投稿者がログインしている自身のユーザーであれば、タイトル、記事本文
の編集、画像の変更ができる。