Skip to content

Instantly share code, notes, and snippets.

@krisleech
Last active November 10, 2017 10:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save krisleech/017946a8c928c3f16ce1e54de09aab83 to your computer and use it in GitHub Desktop.
Save krisleech/017946a8c928c3f16ce1e54de09aab83 to your computer and use it in GitHub Desktop.
Try to reproduce possible bug in Rails 5.0.1 where attribute value is frozen.
key = 'foo'
TextFieldDefinition.create(key: key)
key.frozen? # => true (not expected
# gem 'activerecord', '5.0.1'
require 'bundler'
Bundler.require(:default)
require 'active_record'
require 'pry'
ActiveRecord::Base.establish_connection(adapter: 'sqlite3',
database: File.dirname(__FILE__) + "/db.sqlite3")
ActiveRecord::Schema.define do
self.verbose = false
create_table :users, :force => true do |t|
t.string :key
t.timestamps
end
end
class User < ActiveRecord::Base; end
KEY = 'foo'
# class String; def freeze; raise if self == KEY; self; end; end
user = User.create(key: KEY)
puts KEY.frozen? # => true
irb(main):001:0> KEY = 'ff'
=> "ff"
irb(main):002:0> TextFieldDefinition.create(key: KEY)
   (0.2ms)  BEGIN

From: /home/kris/.gem/ruby/2.3.1/gems/activemodel-5.0.1/lib/active_model/type/immutable_string.rb @ line 26 ActiveModel::Type::ImmutableString#cast_value:

    19: def cast_value(value)
    20:   result = case value
    21:            when true then "t"
    22:            when false then "f"
    23:            else value.to_s
    24:            end
    25:   binding.pry
 => 26:   result.freeze
    27: end

[1] pry(#<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString>)> 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment