Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save LCShen/6c3e2e70f557f58b5696476aedb7fc81 to your computer and use it in GitHub Desktop.

Select an option

Save LCShen/6c3e2e70f557f58b5696476aedb7fc81 to your computer and use it in GitHub Desktop.

Revisions

  1. @hiasinho hiasinho revised this gist Jan 5, 2015. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions factory_girl_strategy_find_or_create.rb
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    ## http://stackoverflow.com/questions/7145256
    module FactoryGirl
    module Strategy
    class Find
  2. @hiasinho hiasinho revised this gist Jan 5, 2015. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion factory_girl_strategy_find_or_create.rb
    Original file line number Diff line number Diff line change
    @@ -43,5 +43,4 @@ def result(evaluation)

    register_strategy(:find, Strategy::Find)
    register_strategy(:find_or_create, Strategy::FindOrCreate)

    end
  3. @hiasinho hiasinho revised this gist Jan 5, 2015. 1 changed file with 5 additions and 4 deletions.
    9 changes: 5 additions & 4 deletions factory_girl_strategy_find_or_create.rb
    Original file line number Diff line number Diff line change
    @@ -40,7 +40,8 @@ def result(evaluation)
    end
    end
    end
    end

    FactoryGirl.register_strategy(:find, FactoryGirl::Strategy::Find)
    FactoryGirl.register_strategy(:find_or_create, FactoryGirl::Strategy::FindOrCreate)

    register_strategy(:find, Strategy::Find)
    register_strategy(:find_or_create, Strategy::FindOrCreate)

    end
  4. @hiasinho hiasinho renamed this gist Jan 5, 2015. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -30,7 +30,7 @@ def initialize

    def result(evaluation)
    found_object = @strategy.result(evaluation)

    if found_object.nil?
    @strategy = FactoryGirl.strategy_by_name(:create).new
    @strategy.result(evaluation)
  5. @hiasinho hiasinho revised this gist Jan 5, 2015. 1 changed file with 9 additions and 9 deletions.
    18 changes: 9 additions & 9 deletions factory_girl.rb
    Original file line number Diff line number Diff line change
    @@ -9,16 +9,16 @@ def result(evaluation)
    build_class(evaluation).where(get_overrides(evaluation)).first
    end

    protected
    private

    def build_class(evaluation)
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@build_class)
    end
    def build_class(evaluation)
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@build_class)
    end

    def get_overrides(evaluation = nil)
    return @overrides unless @overrides.nil?
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@evaluator).instance_variable_get(:@overrides).clone
    end
    def get_overrides(evaluation = nil)
    return @overrides unless @overrides.nil?
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@evaluator).instance_variable_get(:@overrides).clone
    end
    end

    class FindOrCreate
    @@ -30,7 +30,7 @@ def initialize

    def result(evaluation)
    found_object = @strategy.result(evaluation)
    # byebug

    if found_object.nil?
    @strategy = FactoryGirl.strategy_by_name(:create).new
    @strategy.result(evaluation)
  6. @hiasinho hiasinho created this gist Jan 5, 2015.
    46 changes: 46 additions & 0 deletions factory_girl.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    module FactoryGirl
    module Strategy
    class Find
    def association(runner)
    runner.run
    end

    def result(evaluation)
    build_class(evaluation).where(get_overrides(evaluation)).first
    end

    protected

    def build_class(evaluation)
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@build_class)
    end

    def get_overrides(evaluation = nil)
    return @overrides unless @overrides.nil?
    evaluation.instance_variable_get(:@attribute_assigner).instance_variable_get(:@evaluator).instance_variable_get(:@overrides).clone
    end
    end

    class FindOrCreate
    def initialize
    @strategy = FactoryGirl.strategy_by_name(:find).new
    end

    delegate :association, to: :@strategy

    def result(evaluation)
    found_object = @strategy.result(evaluation)
    # byebug
    if found_object.nil?
    @strategy = FactoryGirl.strategy_by_name(:create).new
    @strategy.result(evaluation)
    else
    found_object
    end
    end
    end
    end
    end

    FactoryGirl.register_strategy(:find, FactoryGirl::Strategy::Find)
    FactoryGirl.register_strategy(:find_or_create, FactoryGirl::Strategy::FindOrCreate)