Created
February 15, 2017 08:58
-
-
Save mufid/874ec8f6fa265d632f87c0846234477a to your computer and use it in GitHub Desktop.
Rails Nested Query
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
require 'bundler/inline' | |
rescue LoadError => e | |
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler' | |
raise e | |
end | |
gemfile(true) do | |
source 'https://rubygems.org' | |
gem 'rails', '>= 5.0.1' | |
gem 'pg' | |
gem 'pry' | |
end | |
require 'active_record' | |
require 'minitest/autorun' | |
require 'logger' | |
require 'pry' | |
DB_NAME = 'issue_nested_query' | |
system("dropdb #{DB_NAME}") | |
system("createdb #{DB_NAME}") | |
# This connection will do for database-independent bug reports. | |
ActiveRecord::Base.establish_connection(adapter: 'postgresql', database: DB_NAME) | |
ActiveRecord::Base.logger = Logger.new(STDOUT) | |
ActiveRecord::Schema.define do | |
create_table :posts, force: true do |t| | |
t.integer :views_count | |
end | |
create_table :comments, force: true do |t| | |
t.integer :post_id | |
end | |
end | |
class Post < ActiveRecord::Base | |
has_many :comments | |
end | |
class Comment < ActiveRecord::Base | |
belongs_to :post | |
end | |
class BugTest < Minitest::Test | |
def test_association_stuff | |
post = Post.create!(views_count: 100) | |
Comment.create!(post: post) | |
post2 = Post.create!(views_count: 5) | |
Comment.create!(post: post2) | |
# Should be able to get posts with views between 50 and 500 | |
query = Post.where(views_count: 50..500) | |
assert_equal query.to_a.first.id, post.id | |
# It works for query without parameters | |
query = Comment.where(Post.where('views_count BETWEEN ? AND ?', 50, 500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '50' | |
assert_equal query.to_a.first.post_id, post.id | |
# But somehow it can't retrieve comments which the post have views between 50 to 500 | |
# if we user parameters | |
query = Comment.where(Post.where(views_count: 50..500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '50' | |
assert_equal query.to_a.first.post_id, post.id | |
# This also won't work | |
query = Comment.where(Post.where(views_count: 500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '500' | |
assert_equal query.to_a.first.post_id, post.id | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
require "bundler/inline" | |
rescue LoadError => e | |
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" | |
raise e | |
end | |
gemfile(true) do | |
source "https://rubygems.org" | |
gem "rails", github: "rails/rails" | |
gem "arel", github: "rails/arel" | |
gem "sqlite3" | |
gem "pry" | |
end | |
require "active_record" | |
require "minitest/autorun" | |
require "logger" | |
# This connection will do for database-independent bug reports. | |
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") | |
ActiveRecord::Base.logger = Logger.new(STDOUT) | |
ActiveRecord::Schema.define do | |
create_table :posts, force: true do |t| | |
t.integer :views_count | |
end | |
create_table :comments, force: true do |t| | |
t.integer :post_id | |
end | |
end | |
class Post < ActiveRecord::Base | |
has_many :comments | |
end | |
class Comment < ActiveRecord::Base | |
belongs_to :post | |
end | |
class BugTest < Minitest::Test | |
def test_association_stuff | |
post = Post.create!(views_count: 100) | |
Comment.create!(post: post) | |
post2 = Post.create!(views_count: 5) | |
Comment.create!(post: post2) | |
# Should be able to get posts with views between 50 and 500 | |
query = Post.where(views_count: 50..500) | |
assert_equal query.to_a.first.id, post.id | |
# It works for query without parameters | |
query = Comment.where(Post.where('views_count BETWEEN ? AND ?', 50, 500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '50' | |
assert_equal query.to_a.first.post_id, post.id | |
# But somehow it can't retrieve comments which the post have views between 50 to 500 | |
# if we user parameters | |
query = Comment.where(Post.where(views_count: 50..500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '50' | |
assert_equal query.to_a.first.post_id, post.id | |
# This also won't work | |
query = Comment.where(Post.where(views_count: 500).where('posts.id = comments.post_id').exists) | |
assert_includes query.to_sql, '500' | |
assert_equal query.to_a.first.post_id, post.id | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment