テーブルの構成
- groupsテーブル
- messagesテーブル
アソシエーション
groups
: has_many :messagesmessages
: belongs_to :group
したかったこと
特定のグループの最新メッセージをアソシエーションを利用して取得したい。
上手くいかなかったコード
messages_controller.rb
#略defindex#略@latest_massage=@group.messages.order(updated_at: :desc).limit(1)end#略defset_group@group=Group.find(params[:group_id])end
index.html.erb
#略@latest_message.content
出力結果 → NoMethodError
contentを取り出せたコード
index.html.erb
#略@latest_message[0].content
学んだこと
@group.messages.order(updated_at: :desc).limit(1)
では、まだメッセージは配列に格納されたハッシュのままなので、.content
で取り出すためには、要素の指定がいる。配列に格納された状態ではゲッターメソッドは使えない。order(updated_at: :desc).limit(1)
を使わなくても、最新メッセージを取得するのであれば、@group.messages.last.content
とするのが手っ取り早い。- contentを取り出すだけなら、eachメソッドに
@group.messages
を渡して順番に取り出せる。