For example, in ActiveRecord (the Ruby library that this looks very much influenced by), given:
posts = Post.where(user_id: 1)
...you can now do things like: recent_posts = posts.order(created_at: :desc).limit(100)
or tagged = recent_posts.where('tag in ?', ['hacker', 'news'])
and then you can extract data: tagged.group_by('tag')
or do mutate it: tagged.update_attributes({author_id: 2})
or tagged.destroy_all
...And so on. By encapsulating a result set as something that can be augmented with new query clauses (where, limit, select) and so on, you can incrementally build queries, pass them to other functions, store them as member variables so that they be reused as "scopes" across multiple calls, and so on.If the query were just a string, this sort of thing becomes awkward, verbose, brittle, and generally not type-safe.