テーブルの構成
- groupsテーブル
- messagesテーブル
アソシエーション
-
groups: has_many :messages -
messages: belongs_to :group
したかったこと
特定のグループの最新メッセージをアソシエーションを利用して取得したい。
上手くいかなかったコード
messages_controller.rb
# 略
def index
#略
@latest_massage = @group.messages.order(updated_at: :desc).limit(1)
end
#略
def set_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を渡して順番に取り出せる。