class ArelExtensions::Nodes::DateAdd
Constants
- RETURN_TYPE
Attributes
date_type[RW]
Public Class Methods
new(expr)
click to toggle source
Calls superclass method
# File lib/arel_extensions/nodes/date_diff.rb, line 40 def initialize expr col = expr.first @date_type = type_of_attribute(col) tab = expr.map do |arg| convert(arg) end return super(tab) end
Public Instance Methods
mssql_datepart(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 127 def mssql_datepart(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date Arel.sql('day') elsif @date_type == :datetime Arel.sql('second') end else if ArelExtensions::Nodes::Duration === v v.with_interval = true case v.left when 'd','m','y' Arel.sql('day') when 'h','mn','s' Arel.sql('second') when /i\z/ Arel.sql(Arel::Visitors::MSSQL::DATE_MAPPING[v.left[0..-2]]) else Arel.sql(Arel::Visitors::MSSQL::DATE_MAPPING[v.left]) end end end end
mssql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 114 def mssql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date v.to_i / (24*3600) elsif @date_type == :datetime v.to_i end else v end end
mysql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 62 def mysql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date || @date_type == :datetime Arel.sql('INTERVAL %s' % v.inspect.sub(/s\Z/, '')) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
oracle_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 96 def oracle_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :ruby_date Arel.sql("(INTERVAL '1' DAY) * %s" % v.inspect.to_i) else Arel.sql("(INTERVAL '1' SECOND) * %s" % v.to_i) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
postgresql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 78 def postgresql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date Arel.sql("INTERVAL '%s'" % v.inspect.sub(/s\Z/, '').upcase) elsif @date_type == :datetime Arel.sql("INTERVAL '%s'" % v.inspect.sub(/s\Z/, '').upcase) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
sqlite_value()
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 49 def sqlite_value v = self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date return Arel::Nodes.build_quoted((v.value >= 0 ? '+' : '-') + v.inspect) elsif @date_type == :datetime return Arel::Nodes.build_quoted((v.value >= 0 ? '+' : '-') + v.inspect) end else return v end end
Private Instance Methods
convert(object)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 154 def convert(object) case object when Arel::Attributes::Attribute, Arel::Nodes::Node, ActiveSupport::Duration object when Integer object.days when DateTime, Time, Date raise(ArgumentError, "#{object.class} cannot be converted to Integer") when String Arel::Nodes.build_quoted(object) else raise(ArgumentError, "#{object.class} cannot be converted to Integer") end end