我有下面的模仿我的问题的ActiveRecord测试用例。我有一个People表,其中一个属性是日期。我创建了该表中添加一列的观点就是一个将日期加20分:ActiveRecord/sqlite3列类型在表视图中丢失?
#!/usr/bin/env ruby
%w|pp rubygems active_record irb active_support date|.each {|lib| require lib}
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:database => "test.db"
)
ActiveRecord::Schema.define do
create_table :people, :force => true do |t|
t.column :name, :string
t.column :born_at, :datetime
end
execute "create view clowns as select p.name, p.born_at, datetime(p.born_at, '+' || '20' || ' minutes') as twenty_after_born_at from people p;"
end
class Person < ActiveRecord::Base
validates_presence_of :name
end
class Clown < ActiveRecord::Base
end
Person.create(:name => "John", :born_at => DateTime.now)
pp Person.all.first.born_at.class
pp Clown.all.first.born_at.class
pp Clown.all.first.twenty_after_born_at.class
的问题是,输出
Time
Time
String
当我想到视图的新datetime属性也是在Ruby世界中的时间或日期时间。有任何想法吗?
我也试过:
create view clowns as select p.name, p.born_at, CAST(datetime(p.born_at, '+' || '20' || ' minutes') as datetime) as twenty_after_born_at from people p;
具有相同的结果。
问题是RoR和sqlite3。第一个使用table_info PRAGMA进行视图时,它知道sqlite3不能给你一个视图的类型。它应该在结果集上使用sqlite3_column_type(但似乎ActiveRecord中的类型只能解析一次表)。 Sqlite的错误不是在视图中提供类型,它们可以映射到原始表,在这种情况下,也可以是datetime()函数的结果(MySQL至少可以)。 – duncan 2010-05-07 06:49:55