ActiveRecord如何管理模型值到给定列的相应数据库格式的转换?

时间:2014-11-14 19:36:22

标签: mysql ruby-on-rails sql-server activerecord ruby-on-rails-4

上下文:我正在创建一个方法,可以使用Arel的InsertManager和to_sql方法从json对象(从ActiveRecord模型生成:Post.new.to_json)生成大量插入语句,以生成单个插入语句,然后将各个查询解析为批量插入查询。

问题:我从数据库中收到数据格式错误,因为created_at字段格式错误。 to_json方法使用以下格式保存日期时间字段 “2014-11-14T09:39:17.422-07:00”,而数据库希望以这种格式“2014-11-14 09:39:17”。我意识到我可以在其他字段中遇到此问题,数据是正确的,但它的格式不正确。

问题: 如何在不编写所有规则的情况下正确处理数据?

我假设ActiveRecord有一个可以执行此操作的库,因为即使存储的值与查询中的值不同,sql也是正确的:

p = Post.new
p.created_at = Time.now.to_s(:db) # => "2014-11-14 19:20:55"
p.created_at                      # => Fri, 14 Nov 2014 19:20:55 MST -07:00
p.created.to_json                 # => "\"2014-11-14T19:20:55.000-07:00\""

p.save
# =>INSERT INTO `posts` (`created_at`, `updated_at`) VALUES ('2014-11-15 02:20:55', '2014-11-14 19:25:07')

1 个答案:

答案 0 :(得分:0)

因此,在搜索互联网寻找答案时,我偶然发现了ActiveRecord连接所使用的some methods。似乎将数据转换为正确格式的正确方法是:

ActiveRecord::Base.connection.type_cast Time.now, Post.column_types["created_at"] 
# => "2014-12-01 15:53:05"

如果你想要引用的值(并且它至少做了一点数据转换),那么使用:

ActiveRecord::Base.connection.quote Time.now 
# => "'2014-12-01 15:54:40'"