テーブルの構成
- 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
を渡して順番に取り出せる。