読者です 読者をやめる 読者になる 読者になる

ActiveSupportのRange拡張

active_support/core_ext/range/ 以下をざっとみてみた。

include_with_range.rb

Range#include_with_range?(val)はvalがRangeじゃなかったら単純にincludeしてるかを
判断し、Rangeだった場合はレシーバの範囲内に収まっているかどうかを検証する。

irb(main):005:0> require "active_support/core_ext/range"
=> []
irb(main):007:0> (1..10).include_with_range?(3)
=> true
irb(main):008:0> (1..10).include_with_range?(11)
=> false
irb(main):009:0> (1..10).include_with_range?(2..9)
=> true
irb(main):010:0> (1..10).include_with_range?(2..11)
=> false
irb(main):011:0> (1..10).include_with_range?(0..11)
=> false
overlaps.rb

Range#overlaps?(val)はvalがレシーブの一部にでも含まれているかどうかを検証する。

irb(main):015:0> (1..10).overlaps?(9..11)
=> true
irb(main):016:0> (1..10).overlaps?(2..10)
=> true
irb(main):017:0> (1..10).overlaps?(11..12)
=> false
conversions.rb

これはどの拡張クラスにもつくみたい。
Range#to_formatted_s(format=:default)はformat=:defaultでRangeのto_sをそのまま呼ぶ。
format=:dbを指定した場合Procが呼ばれてDBに問い合わせる文字列が帰る。

irb(main):004:0> (1..10).to_formatted_s
=> "1..10"
irb(main):003:0> require "active_support/time"
=> true
irb(main):004:0> date_range = Date.new(2012,8,16)..Date.new(2012,8,20)
=> Thu, 16 Aug 2012..Mon, 20 Aug 2012
irb(main):009:0> date_range.to_s(:db)
=> "BETWEEN '2012-08-16' AND '2012-08-20'"
irb(main):010:0> date_range.to_formatted_s(:db)
=> "BETWEEN '2012-08-16' AND '2012-08-20'"