module Featuring::Persistence::ActiveRecord

public

Persists feature flag values using an ActiveRecord model. Postgres is currently the only

supported database (see ‘Featuring::Persistence` for details on how to use persistence).

class User < ActiveRecord::Base
  extend Featuring::Persistence::ActiveRecord

  extend Featuring::Declarable
  feature :some_feature
end

User.find(1).features.enable :some_feature
User.find(1).features.some_feature?
=> true

Public Class Methods

create(target, **features) click to toggle source
# File lib/featuring/persistence/activerecord.rb, line 46
def create(target, **features)
  target.feature_flag_model.create(
    flaggable_id: target.id,
    flaggable_type: target.class.name,
    metadata: features
  )
end
fetch(target) click to toggle source
# File lib/featuring/persistence/activerecord.rb, line 42
def fetch(target)
  target.feature_flag_model.find_by(flaggable_id: target.id, flaggable_type: target.class.name)&.metadata
end
replace(target, **features) click to toggle source
# File lib/featuring/persistence/activerecord.rb, line 58
def replace(target, **features)
  scoped_dataset(target).update_all("metadata = '#{features.to_json}'")
end
update(target, **features) click to toggle source
# File lib/featuring/persistence/activerecord.rb, line 54
def update(target, **features)
  scoped_dataset(target).update_all("metadata = metadata || '#{features.to_json}'")
end

Private Class Methods

scoped_dataset(target) click to toggle source
# File lib/featuring/persistence/activerecord.rb, line 62
        def scoped_dataset(target)
  target.feature_flag_model.where(
    flaggable_type: target.class.name,
    flaggable_id: target.id
  )
end

Public Instance Methods

feature_flag_model() click to toggle source
public

Returns the ActiveRecord model used to persist feature flag values.

# File lib/featuring/persistence/activerecord.rb, line 37
def feature_flag_model
  ::FeatureFlag
end