LoginSignup
0
0

More than 3 years have passed since last update.

データベースからViewに投稿者名表示させる方法いくつか2(データベース検索方法)アソシエーション編

Last updated at Posted at 2021-04-20

自分の理解を深めるために書いています。
自分は出社するといつもエクセルVBAでデータ作成が多いのですが、

例えば今日はある学年数千名分の名簿のアドレス1とアドレス2(1は都道府県市区町村2は番地建物名部屋番号)を
アドレス1〜5(1が都道府県2が市区3町村4番地5建物名等)で分けて提出するなんて作業を行っていました。

なのでfindやwhereなどはエクセルにあるので使いなれた存在でした。

今日はわたしのアソシエーションを使った変数の初体験になります。
直感的に操作できるといいますが、私自身はわかりにくいものでした。

テキストの引用から

投稿者名を表示するようにビューを変更しよう

tweetsテーブルのレコードである、「name」カラムの値が表示されている部分を、
アソシエーションを利用してツイート投稿者の「nickname」が表示されるように変更します。
Tweetモデルに対して「Tweet belongs to User」という形でアソシエーションを定義しているので、Tweetモデルのインスタンスが入った変数.userと記述すると、インスタンスが属しているUserモデルのインスタンスを取得できます。

コンソールを利用して例を見てみましょう。

アソシエーションを利用しない場合

% rails c
[1] pry(main)> tweet = Tweet.find(1)
[2] pry(main)> User.find(tweet.user_id)
=> #<User id: 1, email: "test@gmail.com", encrypted_password: "@@@@@@@@@@@@@@@@@", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2014-12-06 09:00:00", last_sign_in_at: "2014-12-06 09:00:00", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-12-06 09:00:00", updated_at: "2014-12-06 09:00:00", nickname: "test_ruby">

アソシエーションを利用した場合

% rails c
[1] pry(main)> tweet = Tweet.find(1)
[2] pry(main)> tweet.user
=> #<User id: 1, email: "test@gmail.com", encrypted_password: "@@@@@@@@@@@@@@@@@", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2014-12-06 09:00:00", last_sign_in_at: "2014-12-06 09:00:00", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-12-06 09:00:00", updated_at: "2014-12-06 09:00:00", nickname: "test_ruby">

では実際にViewとコントローラでみてみましょう!

contoroller/items.rb
def show
    @item = Item.find(params[:id])
end

※もし @itemの@とったらインスタンス変数からローカル変数に変わるのでitemの使える範囲(スコープ)は
def show 〜 endまでになるのでviewのitemsのshowには変数の値を引き渡せなくなる。

contoroller/items.rb
def show
    @item = Item.find(params[:id])
end
items/show.html.erb
<th class="detail-item">出品者</th>
<td class="detail-value"><%= @item.user.nickname %></td>

ここでアソシエーションについて

models/user.rb
has_many :items #複数形名詞(itemsは出品物)
models/item.rb
has_many :user #単数形名詞(itemsは出品物)

この@item.user.nicknameについて

.@item.がitems_controllerからのインスタンス変数

2.user.が上に書いたアソシエーションを組んだ先のテーブル名(アソシエションの命名規則に合わせて)

今回は@itemなのでitemテーブルの組んだアソシエション相手はuserなので命名規則単数系でuserとします。

3.(最後)userテーブル内の欲しいカラム名を記述します。

今回はnickname

理解が進みました。
色々な方に感謝!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0