Skip to content

Instantly share code, notes, and snippets.

@rsutphin
Created January 23, 2011 22:55
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 rsutphin/792546 to your computer and use it in GitHub Desktop.
Save rsutphin/792546 to your computer and use it in GitHub Desktop.
Odd problem with decimal PKs and validation failures in ActiveRecord's save! on JRuby
Gemfile.lock
*.sqlite3
#!/usr/bin/env ruby
require 'rubygems'
require 'active_record'
ActiveRecord::Base.establish_connection(
:database => 'people.sqlite3',
:adapter => RUBY_PLATFORM == 'java' ? 'jdbcsqlite3' : 'sqlite3'
)
ActiveRecord::Schema.create_table('people',
:id => false,
:force => true
) do |t|
t.decimal :id, :primary_key => true
t.string :username
end
ActiveRecord::Base.connection.execute(
"INSERT INTO people (id, username) VALUES (1.0, 'jo')")
class Person < ActiveRecord::Base
validate :validate_fail
def validate_fail
errors.add(:username, "no good")
end
end
p = Person.find_by_username 'jo'
# This block throws the expected exception on MRI 1.8 and 1.9, but
# throws a NoMethodError referencing "coerce" on TrueClass on JRuby.
begin
p.save!
rescue ActiveRecord::RecordInvalid => e
puts "Validation aborted save as expected.\n #{e.class}: #{e}"
end
source :rubygems
gem 'activerecord', '2.3.10'
platform :jruby do
gem 'activerecord-jdbcsqlite3-adapter'
end
platform :ruby_18, :ruby_19 do
gem 'sqlite3'
end
@rsutphin
Copy link
Author

Output on JRuby 1.5.6:
-- create_table("people", {:id=>false, :force=>true})
-> 0.1080s
-> 0 rows
/Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/base.rb:2981:in convert_number_column_value': undefined methodcoerce' for true:TrueClass (NoMethodError)
from /Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/attribute_methods.rb:311:in write_attribute' from /Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/dirty.rb:139:inwrite_attribute_with_dirty'
from /Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/base.rb:2551:in id=' from /Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/transactions.rb:212:inrollback_active_record_state!'
from /Users/rsutphin/.rvm/gems/jruby-1.5.6@bcsec/gems/activerecord-2.3.10/lib/active_record/transactions.rb:200:in `save_with_transactions!'
from bizarre-jruby-ar.rb:35

The output on ruby 1.8 and 1.9 is as expected.

@rsutphin
Copy link
Author

rsutphin commented Feb 9, 2011

Output on JRuby 1.6.0.RC1:

$ ruby bizarre-jruby-ar.rb 
-- create_table("people", {:id=>false, :force=>true})
   -> 0.1110s
   -> 0 rows
org/jruby/RubyBigDecimal.java:821:in `eql_p': undefined method `coerce' for true:TrueClass (NoMethodError)
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/base.rb:2981:in `convert_number_column_value'
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/attribute_methods.rb:311:in `write_attribute'
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/dirty.rb:139:in `write_attribute_with_dirty'
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/base.rb:2551:in `id='
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/transactions.rb:212:in `rollback_active_record_state!'
    from /Users/rsutphin/.rvm/gems/jruby-1.6.0.RC1@tmp/gems/activerecord-2.3.10/lib/active_record/transactions.rb:200:in `save_with_transactions!'
    from bizarre-jruby-ar.rb:35:in `__file__'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment