Clear ORM
  • Welcome to Clear
  • Introduction
    • Setup
  • Model
    • Defining your model
      • Describing your columns
      • Primary Keys
      • Converters
    • Associations
      • belongs_to
      • has_many
      • has_many through
      • has_one
    • Lifecycle
      • Persistence
      • Validations
      • Triggers
    • Batchs operations
      • Bulk update
      • Bulk insert & delete
    • Transactions & Save Points
      • Transaction & Savepoints
      • Connection pool
    • Locks
  • Querying
    • The collection object
      • Filter the query
        • Filter the query – The Expression Engine
        • Find, First, Last, Offset, Limit
        • Aggregation
        • Ordering & Group by
      • Fetching the query
        • Each and Fetch
        • Cursored fetching
        • Model extra attributes
      • Joins
      • Eager Loading
      • Window and CTE
      • Scopes
    • Writing low-level SQL
      • Select Clause
      • Insert Clause
      • Delete Clause
  • Migrations
    • Manage migrations
    • Call migration script
    • Migration CLI
  • Additional and advanced features
    • JSONB
    • Symbol vs String
    • Enums
    • BCrypt
    • Full Text Search
    • Handling multi-connection
  • Other resources
    • API Documentation
    • Inline documentation
    • Github repository
    • Credits
    • Benchmark
Powered by GitBook
On this page
  1. Querying
  2. The collection object

Joins

In Clear, since every Collection is a SelectBuilder object, you can write very complex queries in a simple fashion. Let's see this example:

# Get the posts of the users which have more than X posts:
def user_with_more_than_x_posts(post_count)
  User.query
    .select("users.id as id")
    .inner_joins("posts"){ posts.user_id == users.id }
    .group_by("users.id")
    .having{ raw("COUNT(*)") > post_count }
end

# Get the posts of the users with more than 10 posts:
Post.query.where{ user_id.in?(user_with_more_than_x_posts(10)) }

Joins

Joins are built using inner_join, left_join, right_join, cross_join or simply join method. An optional block is requested for condition:

# Retrieve users with supervisors
User.query.left_joins("users as u2"){ users.supervisor_id == u2.id }

Additionally, optional parameter lateral can be set to true to create a LATERAL JOIN.

PreviousModel extra attributesNextEager Loading

Last updated 6 years ago