自分の理解を深めるために書いています。
自分は出社するといつもエクセル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)
=> #
>アソシエーションを利用した場合
>```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とコントローラでみてみましょう!
def show
@item = Item.find(params[:id])
end
※もし @itemの@とったらインスタンス変数からローカル変数に変わるのでitemの使える範囲(スコープ)は
def show 〜 endまでになるのでviewのitemsのshowには変数の値を引き渡せなくなる。
def show
@item = Item.find(params[:id])
end
<th class="detail-item">出品者</th>
<td class="detail-value"><%= @item.user.nickname %></td>
ここでアソシエーションについて
has_many :items #複数形名詞(itemsは出品物)
has_many :user #単数形名詞(itemsは出品物)
#この@item.user.nicknameについて
#1.@item.がitems_controllerからのインスタンス変数
#2.user.が上に書いたアソシエーションを組んだ先のテーブル名(アソシエションの命名規則に合わせて)
今回は@itemなのでitemテーブルの組んだアソシエション相手はuserなので命名規則単数系でuserとします。
#3.(最後)userテーブル内の欲しいカラム名を記述します。
今回はnickname
理解が進みました。
色々な方に感謝!