Rals 5.2 - как установить условия на включенный модуль? - PullRequest
1 голос
/ 14 июня 2019

У меня есть (я думаю) обратный этот вопрос .

У меня есть модуль (ActiveConcern), который обычно включен в некоторые модели ActiveRecord:

module IntegrityScoring
  extend ActiveSupport::Concern

  included do
    before_save :calculate_score, if: :has_changes_to_save?
  end

  def calculate_score
    # do some work
  end
end

Теперь я пишу задание на грабли, которое должно вызвать это calc_score:

  task seed_weights: :environment do    
    include IntegrityScoring # * this line throws an error *

    Contact.all.each do |contact|
      contact.score = contact.calculate_score
      contact.save
    end
  end

Выдается ошибка:

undefined method `before_save' for Object:Class

В контексте задачи rake обратный вызов before_save не имеет смысла (и фактически выдает ошибку, так как этот метод здесь не существует, поскольку это не модель ActiveRecord, а просто PORO).

Очевидно, я мог бы удалить код included из модуля и добавить обратный вызов before_save для каждого класса, который включает в себя модуль.

Но я надеюсь, что более простым решением было бы добавить условие к included, чтобы before_save добавлялся только в модели ActiveRecord. Это даже возможно ... что-то вроде:

  included 'only if including class is type of ActiveRecord' do
    before_save :calculate_score, if: :has_changes_to_save?
  end

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вы вызываете Calculate_score в контексте контакта, включение IntegretyScoring не требуется.

0 голосов
/ 14 июня 2019

Я думаю, вы можете пропустить обратные вызовы с

Contact.skip_callback(:save, :before, : calculate_score, raise: false))
...