module BooleanTimestamp::ClassMethods
Public Instance Methods
boolean_timestamp(method_name, strict: true)
click to toggle source
# File lib/boolean_timestamp.rb, line 11 def boolean_timestamp(method_name, strict: true) method_name = String(method_name) column_name = "#{method_name}_at" fully_qualified_column_name = "#{table_name}.#{column_name}" define_boolean_timestamp_scopes(method_name, fully_qualified_column_name, strict: strict) define_boolean_timestamp_accessors(method_name, column_name, strict: strict) end
Private Instance Methods
define_boolean_timestamp_accessors(method_name, column_name, strict:)
click to toggle source
# File lib/boolean_timestamp.rb, line 49 def define_boolean_timestamp_accessors(method_name, column_name, strict:) if strict define_boolean_timestamp_strict_reader(method_name, column_name) else define_boolean_timestamp_loose_reader(method_name, column_name) end alias_method("#{method_name}?", method_name) define_method("#{method_name}=") do |value| if ActiveModel::Type::Boolean::FALSE_VALUES.include?(value) public_send("#{column_name}=", nil) elsif !public_send(method_name) public_send("#{column_name}=", Time.current) end end end
define_boolean_timestamp_loose_reader(method_name, column_name)
click to toggle source
# File lib/boolean_timestamp.rb, line 73 def define_boolean_timestamp_loose_reader(method_name, column_name) define_method(method_name) do public_send(column_name).present? end end
define_boolean_timestamp_loose_scopes(method_name, fully_qualified_column_name)
click to toggle source
# File lib/boolean_timestamp.rb, line 44 def define_boolean_timestamp_loose_scopes(method_name, fully_qualified_column_name) scope(method_name, -> { where("#{fully_qualified_column_name} IS NOT NULL") }) scope("not_#{method_name}", -> { where("#{fully_qualified_column_name} IS NULL") }) end
define_boolean_timestamp_scopes(method_name, fully_qualified_column_name, strict:)
click to toggle source
# File lib/boolean_timestamp.rb, line 22 def define_boolean_timestamp_scopes(method_name, fully_qualified_column_name, strict:) if strict define_boolean_timestamp_strict_scopes(method_name, fully_qualified_column_name) else define_boolean_timestamp_loose_scopes(method_name, fully_qualified_column_name) end end
define_boolean_timestamp_strict_reader(method_name, column_name)
click to toggle source
# File lib/boolean_timestamp.rb, line 67 def define_boolean_timestamp_strict_reader(method_name, column_name) define_method(method_name) do public_send(column_name).present? && !public_send(column_name).future? end end
define_boolean_timestamp_strict_scopes(method_name, fully_qualified_column_name)
click to toggle source
# File lib/boolean_timestamp.rb, line 30 def define_boolean_timestamp_strict_scopes(method_name, fully_qualified_column_name) scope(method_name, -> { where("#{fully_qualified_column_name} <= ?", Time.current) }) scope( "not_#{method_name}", lambda do where( "#{fully_qualified_column_name} IS NULL OR #{fully_qualified_column_name} > ?", Time.current ) end ) end