Skip to content

Instantly share code, notes, and snippets.

@mumoshu
Created August 26, 2014 08:50
Show Gist options
  • Select an option

  • Save mumoshu/d70eb4cefcdf02ed40bd to your computer and use it in GitHub Desktop.

Select an option

Save mumoshu/d70eb4cefcdf02ed40bd to your computer and use it in GitHub Desktop.
bundle exec ruby ar_relation_test.rb
require 'active_record'
require 'mysql2'
require 'minitest/autorun'
require 'logger'
puts "ActiveRecord: #{ActiveRecord::VERSION::STRING}"
ActiveRecord::Base.establish_connection(adapter: "mysql2", host: "localhost", database: "test")
ActiveRecord::Base.logger = Logger.new(STDOUT)
class Author < ActiveRecord::Base
connection.create_table table_name, force: true do |t|
t.string :name
end
has_many :posts
end
class Post < ActiveRecord::Base
connection.create_table table_name, force: true do |t|
t.column :author_id, :integer
t.string :title
t.string :body
end
belongs_to :author
scope :failing_scope, -> {
foo = Post.whose_title_is_foo.where_values.reduce(:and)
bar = Post.whose_title_is_bar.where_values.reduce(:and)
title_is_foo_or_bar = foo.or(bar).to_sql
where(title_is_foo_or_bar)
}
scope :whose_title_is_foo, -> { where(title: 'foo') }
scope :whose_title_is_bar, -> { where(title: 'bar') }
end
class BugTest < MiniTest::Unit::TestCase
def test_select_values_works_with_arel_binds
connection = ActiveRecord::Base.connection
author = Author.create!(name: 'john')
Post.create!(author: author, title: 'foo', body: 'bar')
query = author.posts.select(:title)
p author.posts.failing_scope
args = [query] ## uncomment this line, and comment the next to fail
# args = [query.arel, nil, query.bind_values]
assert_equal({"title" => "foo"}, connection.select_one(*args))
end
end
MiniTest::Unit::TestCase is now Minitest::Test. From test.rb:37:in `<main>'
ActiveRecord: 4.1.4
D, [2014-08-26T17:49:44.090093 #97160] DEBUG -- :  (2.9ms) DROP TABLE `authors`
D, [2014-08-26T17:49:44.104548 #97160] DEBUG -- :  (14.2ms) CREATE TABLE `authors` (`id` int(11) auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB
D, [2014-08-26T17:49:44.111983 #97160] DEBUG -- :  (1.7ms) DROP TABLE `posts`
D, [2014-08-26T17:49:44.121134 #97160] DEBUG -- :  (9.0ms) CREATE TABLE `posts` (`id` int(11) auto_increment PRIMARY KEY, `author_id` int(11), `title` varchar(255), `body` varchar(255)) ENGINE=InnoDB
Run options: --seed 54347
# Running:
D, [2014-08-26T17:49:44.147478 #97160] DEBUG -- :  (0.1ms) BEGIN
D, [2014-08-26T17:49:44.152473 #97160] DEBUG -- : SQL (0.3ms) INSERT INTO `authors` (`name`) VALUES ('john')
D, [2014-08-26T17:49:44.153059 #97160] DEBUG -- :  (0.3ms) COMMIT
D, [2014-08-26T17:49:44.167574 #97160] DEBUG -- :  (0.1ms) BEGIN
D, [2014-08-26T17:49:44.168458 #97160] DEBUG -- : SQL (0.1ms) INSERT INTO `posts` (`author_id`, `body`, `title`) VALUES (1, 'bar', 'foo')
D, [2014-08-26T17:49:44.168966 #97160] DEBUG -- :  (0.4ms) COMMIT
E
Finished in 0.047078s, 21.2413 runs/s, 0.0000 assertions/s.
1) Error:
BugTest#test_select_values_works_with_arel_binds:
NoMethodError: undefined method `reverse' for nil:NilClass
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:14:in `block in to_sql'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/bind_visitor.rb:26:in `call'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/bind_visitor.rb:26:in `visit_Arel_Nodes_BindParam'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:515:in `visit_Arel_Nodes_Equality'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:496:in `block in visit_Arel_Nodes_And'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:496:in `map'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:496:in `visit_Arel_Nodes_And'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:500:in `visit_Arel_Nodes_Or'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/to_sql.rb:343:in `visit_Arel_Nodes_Grouping'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:22:in `visit'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/visitor.rb:5:in `accept'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/visitors/bind_visitor.rb:11:in `accept'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/arel-5.0.1.20140414130214/lib/arel/nodes/node.rb:45:in `to_sql'
test.rb:29:in `block in <class:Post>'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/scoping/named.rb:151:in `call'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/scoping/named.rb:151:in `block (2 levels) in scope'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/relation.rb:285:in `scoping'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/scoping/named.rb:151:in `block in scope'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/relation/delegation.rb:94:in `public_send'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/relation/delegation.rb:94:in `block in method_missing'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/associations/collection_proxy.rb:876:in `block in scoping'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/relation.rb:285:in `scoping'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/associations/collection_proxy.rb:876:in `scoping'
/Users/mumoshu/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_record/relation/delegation.rb:94:in `method_missing'
test.rb:43:in `test_select_values_works_with_arel_binds'
1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment