π§ ActiveRecord-Compliant Document Database with Vector Operations π§
JsonRecord is the first embedded database that combines ActiveRecord compatibility, document flexibility, and vector similarity search in one Ruby gem. It serves as a drop-in replacement for SQLite/PostgreSQL while adding powerful semantic search capabilities for AI applications.
JsonRecord is EXACTLY: A fully ActiveRecord-compliant document database with vector operations!
- Drop-in replacement for SQLite/PostgreSQL in Rails apps
- Configure in
database.yml
just like any other database - Standard
ApplicationRecord
inheritance works perfectly - Rails migrations with vector field support
- JSON-native storage - no SQL schema limitations
- Flexible documents with automatic indexing
- 10-100x faster than SQLite with RocksDB backend
- Embedded database - no separate server needed
- Three engines: Simple (Ruby), Annoy (Spotify), FAISS (Facebook)
- Semantic search with cosine similarity
- Auto-field detection for vector operations
- Combined queries - filter documents AND similarity search
This is the FIRST embedded database that combines:
- ActiveRecord compatibility (like SQLite)
- Document flexibility (like MongoDB)
- Vector similarity search (like Pinecone/Weaviate)
- High performance (RocksDB LSM-tree storage)
In one Ruby gem! π
# Gemfile
gem 'jsonrecord'
# config/database.yml
development:
adapter: jsonrecord # Instead of sqlite3/postgresql
database: db/jsonrecord_dev # Storage path
vector_engine: simple # Vector similarity engine
production:
adapter: jsonrecord
database: db/jsonrecord_prod
vector_engine: faiss # Best performance for production
enable_compression: true
# app/models/user.rb
class User < ApplicationRecord # Normal Rails model!
# Vector field for semantic search
vector_field :profile_embedding, dimensions: 384 # JsonRecord extension
# Standard ActiveRecord works perfectly
validates :name, presence: true
has_many :posts
end
# app/models/post.rb
class Post < ApplicationRecord
vector_field :content_embedding, dimensions: 384
belongs_to :user
validates :title, presence: true
# Semantic search method
def self.semantic_search(query)
query_vector = OpenAI.embedding(query)
similar_to(query_vector, field: :content_embedding, limit: 20)
end
end
# Generate migration with vector fields
rails g jsonrecord:migration CreateUsers name:string email:string profile_embedding:vector:dim384
Generated migration:
# db/migrate/xxx_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.json :profile_embedding # Vector field: 384 dimensions
t.timestamps
end
# Add vector field metadata for JsonRecord
add_vector_field :users, :profile_embedding, dimensions: 384
end
end
# Standard ActiveRecord queries work perfectly
active_users = User.where(active: true)
recent_posts = Post.where(created_at: 1.week.ago..)
# Vector similarity search (JsonRecord extension)
similar_users = User.similar_to(query_embedding, limit: 10)
# Combined queries (document filtering + vector similarity)
ruby_developers = User.where(skills: { includes: "ruby" })
.similar_to(ruby_expert_embedding, field: :profile_embedding)
.limit(10)
# Semantic blog search
@posts = Post.semantic_search("machine learning best practices")
@posts.each { |post| puts "Similarity: #{post.similarity_score}" }
# Standard Rails controller
class PostsController < ApplicationController
def search
@posts = Post.semantic_search(params[:q], limit: 20)
end
def similar
@post = Post.find(params[:id])
@similar_posts = @post.similar_records(:content_embedding, limit: 5)
end
end
# Standard Rails model with AI powers
class Post < ApplicationRecord
vector_field :content_embedding, dimensions: 384
belongs_to :user
validates :title, :content, presence: true
# Generate embedding before save
before_save :generate_content_embedding
scope :published, -> { where(published: true) }
def self.semantic_search(query, limit: 10)
query_embedding = OpenAI.embedding(query)
published.similar_to(query_embedding, field: :content_embedding, limit: limit)
end
private
def generate_content_embedding
combined_text = "#{title} #{content}"
self.content_embedding = OpenAI.embedding(combined_text)
end
end
For applications outside Rails:
require 'jsonrecord'
class User < JSONRecord::Base
column :name, String
column :email, String
column :age, Integer
vector_field :profile_embedding, dimensions: 384
end
# CRUD operations
user = User.new(name: "Alice", email: "[email protected]")
user.profile_embedding = [0.1, 0.2, 0.3, ...] # From your ML model
user.save
# Advanced queries
young_users = User.where(age: { lt: 30 }).to_a
ruby_devs = User.where(skills: { includes: "ruby" }).to_a
# Vector similarity search
similar_users = User.similar_to(query_vector, limit: 5).to_a
similar_users.each do |user|
puts "#{user.name}: #{user.similarity_score.round(3)}"
end
Choose the optimal vector engine for your scale:
# database.yml
development:
vector_engine: simple # Pure Ruby, good for development
test:
vector_engine: simple # Fast startup for tests
production:
vector_engine: faiss # Best performance for large datasets
# Alternative: annoy # Good balance of performance/simplicity
Engine | Performance | Memory | Use Case |
---|---|---|---|
:simple |
Good | Low | Development, < 10K vectors |
:annoy |
Better | Medium | Production, 10K-10M vectors |
:faiss |
Best | Higher | Production, large scale |
JsonRecord is designed as a drop-in replacement:
# Change from:
# adapter: sqlite3
# To:
adapter: jsonrecord
vector_engine: simple
class User < ApplicationRecord
# Add vector capabilities to existing model
vector_field :profile_embedding, dimensions: 384
end
rails g jsonrecord:migration AddProfileEmbeddingToUsers profile_embedding:vector:dim384
rails db:migrate
- 10-100x faster document queries with RocksDB
- Vector similarity search (not available in SQLite)
- Better concurrency with LSM-tree architecture
- Simpler deployment (embedded database)
- Multiple vector engines (simple/annoy/faiss)
- Automatic indexing for document fields
- No SQL complexity for document operations
# Flexible JSON documents
user = User.create!(
name: "Bob",
metadata: {
preferences: ["ruby", "ai"],
scores: { technical: 95, communication: 88 }
}
)
# Complex queries
User.where(metadata: { preferences: { includes: "ruby" } })
# Multi-field vectors
class User < ApplicationRecord
vector_field :profile_embedding, dimensions: 384 # User profile
vector_field :skill_vector, dimensions: 256 # Technical skills
vector_field :image_features, dimensions: 512 # Profile image
end
# Field-specific similarity
similar_profiles = User.similar_to(query, field: :profile_embedding)
similar_skills = User.similar_to(skill_query, field: :skill_vector)
# Combined document + vector filtering
results = User.where(department: 'engineering')
.where(experience: { gte: 5 })
.similar_to(senior_dev_embedding, threshold: 0.8)
.limit(10)
# Chained operations
User.where(active: true)
.similar_to(query_vector)
.order(:similarity_score)
.limit(20)
.offset(10)
JsonRecord automatically detects Rails and stores data in db/jsonrecord.rocksdb
.
# config/initializers/jsonrecord.rb
JSONRecord.configure do |config|
config.database_path = Rails.root.join('storage', 'jsonrecord.rocksdb')
config.vector_engine = :faiss
config.enable_compression = true
config.rocksdb_options = {
write_buffer_size: 64.megabytes,
max_open_files: 1000
}
end
Follows XDG Base Directory specification:
~/.local/share/jsonrecord/
(Linux/Unix)./data/jsonrecord.rocksdb
(development, git-ignored)
Run the comprehensive test suite:
bundle install
bundle exec ruby test/jsonrecord_comprehensive_test.rb
After checking out the repo:
bundle install
ruby test/test_class_return.rb # Test the latest fixes
- ActiveRecord Adapter Guide - Complete Rails integration
- Vector Storage Architecture - Deep dive into similarity search
- Configuration Guide - Detailed setup options
- Performance Benchmarks - Speed comparisons
- Fork it
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -am 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Create a Pull Request
The gem is available as open source under the MIT License.
How JsonRecord compares:
Feature | JsonRecord | SQLite | PostgreSQL + pgvector | MongoDB | Pinecone |
---|---|---|---|---|---|
ActiveRecord | β | β | β | β | β |
Document Storage | β | β | β | β | |
Vector Search | β | β | β | β | |
Embedded | β | β | β | β | β |
Rails Integration | β | β | β | β |
JsonRecord = The best of all worlds! π
JsonRecord transforms Rails applications into AI-native platforms.
β What you get:
- Drop-in replacement for SQLite with
database.yml
configuration - Standard
ApplicationRecord
inheritance with vector extensions - Vector similarity search with
User.similar_to(vector)
- Rails migrations with
rails g jsonrecord:migration
- Multiple vector engines for different scales
- 10-100x performance over raw JSON storage
β Perfect for:
- AI applications needing semantic search
- Document databases with vector capabilities
- Rails apps wanting embedded high-performance storage
- Applications needing both relational and vector data
JsonRecord: The database that thinks like Ruby, performs like C++, and integrates like Rails! π
Built with β€οΈ by developers who understand that performance matters in document databases.