在进行activerecord db query时将字符串转换为datetime

时间:2014-07-16 00:24:16

标签: ruby-on-rails activerecord

我的数据库中有以下表格:

class CreateGoogleRecords < ActiveRecord::Migration
 def change
  create_table :google_records do |t|
   t.string :user_id
   t.string :date
   t.text :stats
   t.string :account_name
   t.integer :total_conversions
   t.decimal :total_cost

   t.timestamps
  end
 end
end

我希望在视图中创建一个表,按月将记录组合​​在一起(我不能使用&#34;创建日期,因为有时它们是从API中批量删除的)。

涉及很多遗留代码,而不是将列转换为datetime我希望我可以在执行查询时将日期字符串转换为datetime对象。

我尝试过编写范围如下:

scope :stats_for_reports, ->(start_date, end_date, user_ids) { select('user_id,  sum(total_cost) as total_cost,  sum(total_conversions) as total_conversions')
                                                              .where('date >= ? and date <= ?', start_date, end_date)
                                                              .where(user_id: user_ids)
                                                              .group(DateTime.parse(:date).month.to_s)}

但我收到TypeError: can't convert Symbol into String错误。

在控制台中,我一直在尝试这样的事情:

GoogleRecord.where(date: date_start..date_end).group{ |m| DateTime.parse(m.date).month }

GoogleRecord.where(date: date_start..date_end).group(:date).to_date

我是否正确地选择其中任何一个?

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用ActiveRecord before_save,after_save,after_initialize?您可以创建一个DateWrapper(非常类似于下面的EncryptionWrapper),并将字符串转换为对其余代码透明的日期。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html