diff --git a/lib/static_association.rb b/lib/static_association.rb index 012ede9..5fe0ae5 100644 --- a/lib/static_association.rb +++ b/lib/static_association.rb @@ -82,6 +82,22 @@ def record(settings, &block) index[id] = record end + def attr_evaluated(*names) + attr_writer(*names) + + names.each do |name| + define_method(name) do + attr_value = instance_variable_get("@#{name}") + + if attr_value.respond_to?(:call) + instance_exec(&attr_value) + else + attr_value + end + end + end + end + private def matches_attributes?(record:, attributes:) diff --git a/spec/static_association_spec.rb b/spec/static_association_spec.rb index 2a76e73..8a54628 100644 --- a/spec/static_association_spec.rb +++ b/spec/static_association_spec.rb @@ -3,7 +3,9 @@ class DummyClass include StaticAssociation + attr_accessor :name + attr_evaluated :gender end class AssociationClass @@ -11,6 +13,7 @@ class AssociationClass attr_accessor :dodo_class_id extend StaticAssociation::AssociationHelpers + belongs_to_static :dummy_class belongs_to_static :dodo_class, class_name: "DummyClass" end @@ -75,6 +78,49 @@ class AssociationClass expect { DummyClass.record(id: 1) }.to change(DummyClass, :count).by(1) end end + + context "when attr_evaluated defined attribute is assigned a lambda" do + it "evaluates the lambda when the attribute is read" do + record = DummyClass.record(id: 1) do + self.gender = -> do + if name == "Jane" + :female + else + :male + end + end + end + + expect(record.gender).to eq(:male) + end + end + + context "when attr_evaluated defined attribute is assigned a proc" do + it "evaluates the proc when the attribute is read" do + record = DummyClass.record(id: 1) do + self.name = "Jane" + self.gender = proc do + if @name == "Jane" + :female + else + :male + end + end + end + + expect(record.gender).to eq(:female) + end + end + + context "when attr_evaluated defined attribute is assigned a static value" do + it "returns the assigned value when the attribute is read" do + record = DummyClass.record(id: 1) do + self.gender = "Not disclosed" + end + + expect(record.gender).to eq("Not disclosed") + end + end end describe ".all" do