hanamiで関連先のモデルにorderやlimitをかける方法
例えば User
モデルが Post
モデルを has_many
している場合に、find_with_posts
で posts
に対して order
や limit
をかけたい場合があると思います。
その方法は公式のDocumentに書いていなかったので、自分がやっている方法を共有します。
def UsersRepository associations do has_many :posts end def find_with_posts(user_id) aggregate(:posts).where( users[:id].qualified.is(user_id) ).node(:posts) do |posts| posts.order(posts[:created_at].qualified.desc) .limit(5) end.map_to(User).to_a end end
のような形で実現できます。 node
のブロック内で任意のSQLを発行できます。この node
メソッドの正体ですが、まずhanamiは ROM
で作られています。
実際 aggregate
の返り値は ROM::Relation::Graph
というクラスを返します。
これに関するドキュメントは以下のリンクにあります。
https://rom-rb.org/learn/core/5.2/combines/#adjusted-combine
まだhanamiの記事は少ないのでどんどん増やしていきたいですね。