Module: PaperTrail::VersionConcern::ClassMethods

Defined in:
lib/paper_trail/version_concern.rb

Overview

:nodoc:

Instance Method Summary collapse

Instance Method Details

#between(start_time, end_time) ⇒ Object



48
49
50
51
52
53
# File 'lib/paper_trail/version_concern.rb', line 48

def between(start_time, end_time)
  where(
    arel_table[:created_at].gt(start_time).
    and(arel_table[:created_at].lt(end_time))
  ).order(timestamp_sort_order)
end

#createsObject



32
33
34
# File 'lib/paper_trail/version_concern.rb', line 32

def creates
  where event: "create"
end

#destroysObject



40
41
42
# File 'lib/paper_trail/version_concern.rb', line 40

def destroys
  where event: "destroy"
end

#not_createsObject



44
45
46
# File 'lib/paper_trail/version_concern.rb', line 44

def not_creates
  where "event <> ?", "create"
end

#object_changes_col_is_json?Boolean

Returns whether the object_changes column is using the json type supported by PostgreSQL.

Returns:

  • (Boolean)


133
134
135
# File 'lib/paper_trail/version_concern.rb', line 133

def object_changes_col_is_json?
  %i[json jsonb].include?(columns_hash["object_changes"].try(:type))
end

#object_col_is_json?Boolean

Returns whether the object column is using the json type supported by PostgreSQL.

Returns:

  • (Boolean)


127
128
129
# File 'lib/paper_trail/version_concern.rb', line 127

def object_col_is_json?
  %i[json jsonb].include?(columns_hash["object"].type)
end

#preceding(obj, timestamp_arg = false) ⇒ Object

Returns versions before obj.

Parameters:

  • obj
    • a Version or a timestamp

  • timestamp_arg (defaults to: false)
    • boolean - When true, obj is a timestamp.

    Default: false.

Returns:

  • ActiveRecord::Relation



144
145
146
147
148
149
150
# File 'lib/paper_trail/version_concern.rb', line 144

def preceding(obj, timestamp_arg = false)
  if timestamp_arg != true && primary_key_is_int?
    preceding_by_id(obj)
  else
    preceding_by_timestamp(obj)
  end
end

#primary_key_is_int?Boolean

Returns:

  • (Boolean)


119
120
121
122
123
# File 'lib/paper_trail/version_concern.rb', line 119

def primary_key_is_int?
  @primary_key_is_int ||= columns_hash[primary_key].type == :integer
rescue StandardError # TODO: Rescue something more specific
  true
end

#subsequent(obj, timestamp_arg = false) ⇒ Object

Returns versions after obj.

Parameters:

  • obj
    • a Version or a timestamp

  • timestamp_arg (defaults to: false)
    • boolean - When true, obj is a timestamp.

    Default: false.

Returns:

  • ActiveRecord::Relation



159
160
161
162
163
164
165
# File 'lib/paper_trail/version_concern.rb', line 159

def subsequent(obj, timestamp_arg = false)
  if timestamp_arg != true && primary_key_is_int?
    subsequent_by_id(obj)
  else
    subsequent_by_timestamp(obj)
  end
end

#timestamp_sort_order(direction = "asc") ⇒ Object

Defaults to using the primary key as the secondary sort order if possible.



57
58
59
60
61
# File 'lib/paper_trail/version_concern.rb', line 57

def timestamp_sort_order(direction = "asc")
  [arel_table[:created_at].send(direction.downcase)].tap do |array|
    array << arel_table[primary_key].send(direction.downcase) if primary_key_is_int?
  end
end

#updatesObject



36
37
38
# File 'lib/paper_trail/version_concern.rb', line 36

def updates
  where event: "update"
end

#where_object(args = {}) ⇒ Object

Given a hash of attributes like ‘name: ’Joan’‘, query the versions.objects column.

“‘ SELECT “versions”.* FROM “versions” WHERE (“versions”.“object” LIKE ’% name: Joan %‘) “`

This is useful for finding versions where a given attribute had a given value. Imagine, in the example above, that Joan had changed her name and we wanted to find the versions before that change.

Based on the data type of the object column, the appropriate SQL operator is used. For example, a text column will use like, and a jsonb column will use ‘@>`.

Raises:

  • (ArgumentError)


83
84
85
86
# File 'lib/paper_trail/version_concern.rb', line 83

def where_object(args = {})
  raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
  Queries::Versions::WhereObject.new(self, args).execute
end

#where_object_changes(args = {}) ⇒ Object

Given a hash of attributes like ‘name: ’Joan’‘, query the versions.objects_changes column.

“‘ SELECT “versions”.* FROM “versions” WHERE .. (“versions”.“object_changes” LIKE ’% name:

  • Joan

%‘ OR “versions”.“object_changes” LIKE ’% name: -%

  • Joan

%‘) “`

This is useful for finding versions immediately before and after a given attribute had a given value. Imagine, in the example above, that someone changed their name to Joan and we wanted to find the versions immediately before and after that change.

Based on the data type of the object column, the appropriate SQL operator is used. For example, a text column will use like, and a jsonb column will use ‘@>`.

Raises:

  • (ArgumentError)


114
115
116
117
# File 'lib/paper_trail/version_concern.rb', line 114

def where_object_changes(args = {})
  raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
  Queries::Versions::WhereObjectChanges.new(self, args).execute
end

#with_item_keys(item_type, item_id) ⇒ Object



28
29
30
# File 'lib/paper_trail/version_concern.rb', line 28

def with_item_keys(item_type, item_id)
  where item_type: item_type, item_id: item_id
end