Skip to content

Instantly share code, notes, and snippets.

@chanks
Created September 23, 2014 19:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chanks/6fd90efd875331535441 to your computer and use it in GitHub Desktop.
Save chanks/6fd90efd875331535441 to your computer and use it in GitHub Desktop.
require 'sequel'
require 'logger'
DB = Sequel.connect "postgres:///scrap"
DB.loggers << Logger.new(STDOUT)
Sequel::Model.plugin :tactical_eager_loading
DB.drop_table? :posts
DB.drop_table? :comments
DB.drop_table? :users
DB.create_table :posts do
primary_key :id
end
DB.create_table :comments do
primary_key :id
integer :post_id
integer :user_id
end
DB.create_table :users do
primary_key :id
end
users = 3.times.map { DB[:users].insert }
posts = 3.times.map { DB[:posts].insert }
users.each do |user|
posts.each do |post|
DB[:comments].insert(user_id: user, post_id: post)
end
end
class Post < Sequel::Model
one_to_many :comments
one_to_many :top_two_comments, :class => :Comment, :limit => 2
end
class User < Sequel::Model
one_to_many :comments
end
class Comment < Sequel::Model
many_to_one :post
many_to_one :user
end
Post.all.first.top_two_comments.first.user
# I, [2014-09-23T15:27:46.376247 #22162] INFO -- : (0.000298s) SELECT * FROM "posts"
# I, [2014-09-23T15:27:46.377502 #22162] INFO -- : (0.000440s) SELECT * FROM (SELECT * FROM "comments" WHERE (1 = "comments"."post_id") LIMIT 2) AS "t1" UNION ALL SELECT * FROM (SELECT * FROM "comments" WHERE (2 = "comments"."post_id") LIMIT 2) AS "t1" UNION ALL SELECT * FROM (SELECT * FROM "comments" WHERE (3 = "comments"."post_id") LIMIT 2) AS "t1"
# I, [2014-09-23T15:27:46.377786 #22162] INFO -- : (0.000119s) SELECT * FROM "users" WHERE "id" = 1
Post.all.map{|p| p.top_two_comments.map{|c| c.user}}
# I, [2014-09-23T15:28:24.895522 #22162] INFO -- : (0.000238s) SELECT * FROM "posts"
# I, [2014-09-23T15:28:24.896143 #22162] INFO -- : (0.000344s) SELECT * FROM (SELECT * FROM "comments" WHERE (1 = "comments"."post_id") LIMIT 2) AS "t1" UNION ALL SELECT * FROM (SELECT * FROM "comments" WHERE (2 = "comments"."post_id") LIMIT 2) AS "t1" UNION ALL SELECT * FROM (SELECT * FROM "comments" WHERE (3 = "comments"."post_id") LIMIT 2) AS "t1"
# I, [2014-09-23T15:28:24.896492 #22162] INFO -- : (0.000174s) SELECT * FROM "users" WHERE "id" = 1
# I, [2014-09-23T15:28:24.896668 #22162] INFO -- : (0.000100s) SELECT * FROM "users" WHERE "id" = 2
# I, [2014-09-23T15:28:24.896850 #22162] INFO -- : (0.000108s) SELECT * FROM "users" WHERE "id" = 1
# I, [2014-09-23T15:28:24.897086 #22162] INFO -- : (0.000159s) SELECT * FROM "users" WHERE "id" = 2
# I, [2014-09-23T15:28:24.897339 #22162] INFO -- : (0.000160s) SELECT * FROM "users" WHERE "id" = 1
# I, [2014-09-23T15:28:24.897591 #22162] INFO -- : (0.000162s) SELECT * FROM "users" WHERE "id" = 2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment