Use ActiveRecord Column#type_cast to properly parse fields represented by a string.

Fixed issued reported by Nick Burdick where imported datetime fields was not correctly working with certain string formats for MySQL which doesn't support MM/DD/YYYY format directly.
This commit is contained in:
Zach Dennis 2011-01-05 19:05:31 -05:00
parent 8e266f74f7
commit 8fbf841fde
3 changed files with 15 additions and 2 deletions

View file

@ -129,7 +129,8 @@ module ActiveRecord::Import::AbstractAdapter
array_of_attributes.each do |arr|
my_values = []
arr.each_with_index do |val,j|
my_values << quote( val, columns[j] )
importable_value = columns[j].type_cast(val)
my_values << quote(importable_value, columns[j] )
end
values << my_values
end

View file

@ -257,7 +257,7 @@ class ActiveRecord::Base
def import_without_validations_or_callbacks( column_names, array_of_attributes, options={} )
escaped_column_names = quote_column_names( column_names )
columns = []
array_of_attributes.first.each_with_index { |arr,i| columns << columns_hash[ column_names[i] ] }
array_of_attributes.first.each_with_index { |arr,i| columns << columns_hash[ column_names[i].to_s ] }
if not supports_import?
columns_sql = "(" + escaped_column_names.join( ',' ) + ")"

View file

@ -199,4 +199,16 @@ describe "#import" do
end
end
context "importing a datetime field" do
it "should import a date with MM/DD/YYYY format just fine" do
Topic.import [:author_name, :title, :last_read], [["Bob Jones", "Topic 1", "05/14/2010"]]
assert_equal "05/14/2010".to_date, Topic.last.last_read.to_date
end
it "should import a date with YYYY/MM/DD format just fine" do
Topic.import [:author_name, :title, :last_read], [["Bob Jones", "Topic 2", "2010/05/14"]]
assert_equal "05/14/2010".to_date, Topic.last.last_read.to_date
end
end
end