我正在尝试重现我在ActiveRecord中使用的SQL查询:
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
但是因为我正在将所有内容转换为DataMapper,所以我正在寻找一种方法来实现这一目标......
有人可以帮忙吗?
答案 0 :(得分:12)
我认为,因为它标记了“ruby-on-rails”,你已经加载了ActiveSupport。这将提供Time#end_of_month辅助方法。有了它,您可以将查询重写为:
time = Date.new(year, month).to_time
Post.all(:created_at => time..time.end_of_month)
这不仅更简单,而且从查询中消除了原始SQL(因此查询对RDBMS以外的其他内容更具可移植性),最重要的是它可能比其他查询执行得更好。使用EXTRACT
,数据库可能必须执行全表扫描以从每行中的created_at 中提取年份和月份,然后将它们与预期值进行比较。如果您有一个大型数据集,这可能会对您的数据库造成重大负担。但是,如果您的created_at列已编制索引,则上述方法相比应该非常有效。