diff --git a/lib/flipper/model/active_record.rb b/lib/flipper/model/active_record.rb index b334ec11f..7de2b3052 100644 --- a/lib/flipper/model/active_record.rb +++ b/lib/flipper/model/active_record.rb @@ -7,6 +7,25 @@ module ActiveRecord def flipper_properties {"type" => self.class.name}.merge(attributes) end + + # Check if a feature is enabled for this record or any associated actors + # returned by `#flipper_actors` + def flipper_enabled?(feature_name) + Flipper.enabled?(feature_name, *flipper_actors) + end + + # Returns the set of actors associated with this record. Override to + # return any other records that should be considered actors. + # + # class User < ApplicationRecord + # # … + # def flipper_actors + # [self, company] + # end + # end + def flipper_actors + [self] + end end end end diff --git a/spec/flipper/model/active_record_spec.rb b/spec/flipper/model/active_record_spec.rb index 00433acad..2c6ab6300 100644 --- a/spec/flipper/model/active_record_spec.rb +++ b/spec/flipper/model/active_record_spec.rb @@ -45,4 +45,33 @@ class User < ActiveRecord::Base }) end end + + describe "flipper_enabled?" do + subject { User.create!(name: "Test") } + + it "delegates to Flipper.enabled?" do + expect(subject.flipper_enabled?(:stats)).to be(false) + Flipper.enable :stats, subject + expect(subject.flipper_enabled?(:stats)).to be(true) + end + + it "returns true if feature is enabled for associated actor" do + friend = User.create!(name: "Friend") + + # Add a flipper_actors method to this instanc + subject.extend Module.new { + attr_accessor :friends + + def flipper_actors + [self] + Array(friends) + end + } + + subject.friends = [friend] + + expect(subject.flipper_enabled?(:stats)).to be(false) + Flipper.enable :stats, friend + expect(subject.flipper_enabled?(:stats)).to be(true) + end + end end