Reference for CQL query methods.
Get all matching records.
users = User.all # All users
users = User.where(active: true).all # FilteredReturns: Array(T)
Get first record.
user = User.first # First by primary key
user = User.order(name: :asc).first # First alphabetically
user = User.where(active: true).first # First activeReturns: T?
Get last record.
user = User.last
user = User.order(created_at: :asc).lastReturns: T?
Find by primary key.
user = User.find(1) # Raises if not found
user = User.find?(1) # Returns nil if not foundReturns: T or T?
Find by attributes.
user = User.find_by(email: "alice@example.com")
user = User.find_by?(email: "alice@example.com")Returns: T or T?
Get n records.
users = User.take(5) # First 5 recordsReturns: Array(T)
Filter by conditions.
# Hash conditions
User.where(active: true)
User.where(role: "admin", active: true)
# SQL conditions
User.where("age > ?", 18)
User.where("created_at > ?", 1.week.ago)
User.where("name LIKE ?", "%smith%")
# IN clause
User.where("id IN (?)", [1, 2, 3])
# NULL check
User.where("deleted_at IS NULL")Returns: Query builder (chainable)
Exclude matching records.
User.where.not(role: "admin")
User.where.not("status IN (?)", ["banned", "suspended"])Combine conditions with OR.
User.where(role: "admin").or(User.where(role: "moderator"))Sort results.
User.order(name: :asc)
User.order(created_at: :desc)
User.order(role: :asc, name: :asc) # Multiple columns
User.order("LOWER(name) ASC") # Raw SQLReturns: Query builder (chainable)
Replace previous ordering.
User.order(name: :asc).reorder(created_at: :desc)Reverse current ordering.
User.order(name: :asc).reverse_order # Now descLimit number of results.
User.limit(10)
User.where(active: true).limit(5)Returns: Query builder (chainable)
Skip records.
User.offset(20)
User.limit(10).offset(20) # Page 3Returns: Query builder (chainable)
Select specific columns.
User.select(:id, :name)
User.select("id, name, email")
User.select("*, LENGTH(bio) as bio_length")Return unique records.
User.select(:role).distinctGet array of column values.
emails = User.pluck(:email) # => ["a@b.com", "c@d.com"]
data = User.pluck(:id, :name) # => [[1, "Alice"], [2, "Bob"]]Returns: Array
Get array of primary key values.
user_ids = User.where(active: true).ids # => [1, 2, 3]Returns: Array(PrimaryKeyType)
Count records.
User.count # Total users
User.where(active: true).count # Active users
User.count(:email) # Non-null emails
User.distinct.count(:role) # Unique rolesReturns: Int64
Sum column values.
Order.sum(:total)
Order.where(user_id: 1).sum(:total)Returns: Number
Average column values.
User.average(:age)
Product.average(:price)Returns: Float64?
Get minimum value.
Product.minimum(:price)
User.minimum(:created_at)Returns: Column type or nil
Get maximum value.
Product.maximum(:price)
User.maximum(:age)Returns: Column type or nil
Group results.
User.select("role, COUNT(*) as count").group(:role)
Order.select("user_id, SUM(total) as total").group(:user_id)Filter groups.
User.select("role, COUNT(*) as count")
.group(:role)
.having("COUNT(*) > ?", 5)Inner join tables.
Post.join(:users, "users.id = posts.user_id")
Post.join(:users, "users.id = posts.user_id")
.select("posts.*, users.name as author_name")Left outer join.
User.left_join(:posts, "posts.user_id = users.id")
.select("users.*, COUNT(posts.id) as post_count")
.group("users.id")Eager load associations.
Post.includes(:author)
User.includes(:posts, :comments)Check if records exist.
User.where(email: "alice@example.com").exists?
User.exists?(email: "alice@example.com")Returns: Bool
Check if any records match.
User.where(role: "admin").any?Returns: Bool
Check if no records match.
User.where(role: "banned").none?Returns: Bool
Check if result set is empty.
User.where(active: false).empty?Returns: Bool
Process records in batches.
User.find_each(batch_size: 1000) do |user|
process(user)
endProcess batches.
User.in_batches(of: 1000) do |batch|
batch.update_all(notified: true)
endDefine reusable queries.
class User
scope :active, -> { where(active: true) }
scope :recent, -> { order(created_at: :desc) }
scope :by_role, ->(role : String) { where(role: role) }
end
User.active.recent.all
User.by_role("admin").countAll query methods are chainable:
User.where(active: true)
.where("age >= ?", 18)
.order(name: :asc)
.limit(10)
.offset(20)
.allExecute raw SELECT.
results = MyDB.query("SELECT * FROM users WHERE age > ?", 18)Execute raw statement.
MyDB.exec("UPDATE users SET active = ? WHERE id = ?", true, 1)