How do I access a class method (or variable) in an instance method using a problem?

I need to access a class method (defined in ClassMethods) in an instance method inside a problem.

My brain has melted and I'm sure it's just that I'm wrong.

I need to open the comparable_opts

inside comparison

. How can i do this?

Follow the snippets below:

Concern

# app/models/concerns/compare.rb
module Compare
  extend ActiveSupport::Concern

  attr_accessor :comparable_opts 

  module ClassMethods
    attr_reader :arguable_opts

    def comparable_opts
      @@comparable_opts
    end

    private
      def default_opts
        @default_opts ||= {fields: [:answers_count, 
                                      :answers_correct_count, 
                                      :answers_correct_rate, 
                                      :users_count]}
      end

      def compare(opts={})
        @comparable_opts = default_opts.merge(opts)
      end
  end

  def comparison
  end
end

      

Model

# app/models/mock_alternative.rb
class MockAlternative < ActiveRecord::Base
  include Compare

  belongs_to :mock, primary_key: :mock_id, foreign_key: :mock_id

  compare fields: [:answers_count, :question_answers_count, :question_answers_rate],
          with: :mock_aternative_school

  def question_answers_rate
    self[:answers_count].to_f/self[:question_answers_count].to_f
  end
end

      

+3


source to share


1 answer


Solution: I just used cattr_accessor

in my method compare

. Thanks everyone.



module Compare
  extend ActiveSupport::Concern


  module ClassMethods
    attr_reader :arguable_opts

    def comparison_klass
      "ActiveRecord::#{comparable_opts[:with].to_s.classify}".constantize
    end

    private
      def default_opts
        @default_opts ||= {fields: [:answers_count, 
                                      :answers_correct_count, 
                                      :answers_correct_rate, 
                                      :users_count]}
      end

      def compare(opts={})
        cattr_accessor :comparable_opts
        self.comparable_opts = default_opts.merge(opts)
      end
  end

  def comparison
    comparable_opts
  end
end

      

+2


source







All Articles