Permalink
Browse files

Merge pull request #15502 from sgrif/sg-use-null-column

Use null column for association key types
  • Loading branch information...
senny committed Jun 4, 2014
2 parents 1ce0cc0 + e8375a6 commit e2e308bbe7188dd59f8f92f8da5dde34c0f45c78
@@ -104,13 +104,11 @@ def key_conversion_required?
end
def association_key_type
- column = @klass.column_types[association_key_name.to_s]
- column && column.type
+ @klass.column_for_attribute(association_key_name).type
end
def owner_key_type
- column = @model.column_types[owner_key_name.to_s]
- column && column.type
+ @model.column_for_attribute(owner_key_name).type
end
def load_slices(slices)
@@ -18,6 +18,8 @@ module AttributeMethods
include TimeZoneConversion
include Dirty
include Serialization
+
+ delegate :column_for_attribute, to: :class
end
AttrNames = Module.new {
@@ -192,6 +194,25 @@ def attribute_names
[]
end
end
+
+ # Returns the column object for the named attribute. Returns +nil+ if the
+ # named attribute not exists.
+ #
+ # class Person < ActiveRecord::Base
+ # end
+ #
+ # person = Person.new
+ # person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
+ # # => #<ActiveRecord::ConnectionAdapters::SQLite3Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>
+ #
+ # person.column_for_attribute(:nothing)
+ # # => #<ActiveRecord::ConnectionAdapters::Column:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
+ def column_for_attribute(name)
+ name = name.to_s
+ columns_hash.fetch(name) do
+ ConnectionAdapters::Column.new(name, nil, Type::Value.new)
+ end
+ end
end
# If we haven't generated any methods yet, generate them, then
@@ -339,25 +360,6 @@ def attribute_present?(attribute)
!value.nil? && !(value.respond_to?(:empty?) && value.empty?)
end
- # Returns the column object for the named attribute. Returns +nil+ if the
- # named attribute not exists.
- #
- # class Person < ActiveRecord::Base
- # end
- #
- # person = Person.new
- # person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
- # # => #<ActiveRecord::ConnectionAdapters::SQLite3Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>
- #
- # person.column_for_attribute(:nothing)
- # # => #<ActiveRecord::ConnectionAdapters::Column:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
- def column_for_attribute(name)
- name = name.to_s
- self.class.columns_hash.fetch(name) do
- ConnectionAdapters::Column.new(name, nil, Type::Value.new)
- end
- end
-
# Returns the value of the attribute identified by <tt>attr_name</tt> after it has been typecast (for example,
# "2004-12-12" in a date column is cast to a date object, like Date.new(2004, 12, 12)). It raises
# <tt>ActiveModel::MissingAttributeError</tt> if the identified attribute is missing.

0 comments on commit e2e308b

Please sign in to comment.