Module: StateTransitions::ClassMethods

Defined in:
lib/state_transitions.rb

Instance Method Summary collapse

Instance Method Details

#define_first_state_transition_scope(state) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/state_transitions.rb', line 40

def define_first_state_transition_scope(state)
  sql = <<~SQL.squish
    #{current_table_name}.id = (
      SELECT first_state_transition.id
      FROM state_transitions AS first_state_transition
      WHERE
        first_state_transition.resource_type = #{current_table_name}.resource_type AND
        first_state_transition.resource_id = #{current_table_name}.resource_id AND
        first_state_transition.state_to = ?
      ORDER BY first_state_transition.created_at
      LIMIT 1
    )
  SQL

  has_one :"first_#{state}_state_transition",
    -> { where(sql, state) },
    as: :resource,
    class_name: "StateTransitions::StateTransition"
end

#track_state_transitionsObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/state_transitions.rb', line 10

def track_state_transitions
  model_class = self

  has_one :current_state_transition,
    lambda {
      where(
        <<~SQL.squish
          #{current_table_name}.id = (
            SELECT current_state_transition.id
            FROM state_transitions AS current_state_transition
            WHERE
              current_state_transition.resource_type = #{current_table_name}.resource_type AND
              current_state_transition.resource_id = #{current_table_name}.resource_id
            ORDER BY current_state_transition.created_at DESC
            LIMIT 1
          )
        SQL
      )
    },
    as: :resource,
    class_name: "StateTransitions::StateTransition"

  has_many :state_transitions,
    as: :resource,
    class_name: "StateTransitions::StateTransition",
    dependent: :destroy

  after_save :save_state_transition, if: :saved_change_to_state?
end