Обезьяна, исправляющая основной класс с помощью бизнес-логики с помощью Rails - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть исправленная обезьяна ActiveRecord find с некоторой бизнес-логикой, например:

# lib/core_extensions/active_record/finder_methods/finder.rb
module ActiveRecord
  module FinderMethods
    def find(*args)
      return super if block_given?  

      #... business logic code =>  my_error_control = true

      raise "My Error" if my_error_control
      retorn = find_with_ids(*args)
    end
  end
end
retorn

Я не видел много подобных примеров, и это вызывает у меня сомнения:

Где должно быть finder.rb?

В этом примере этот файл находится в lib/core_extensions/..., но если он содержит бизнес-логика , я думаю, finder.rb должен находиться в папке app/core_extensions/ не так ли?


Отредактировано, после ответа Серхио

подобные вещи, плохая практика?

# lib/core_extensions/nil_class/image_attributes.rb
# suport for product images attributes
class NilClass
  def main_image(size,evita_video)
    "/images/paperclip_missing/original/missing.png"
  end
end

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Где должен быть файл finder.rb?

В конечном счете, это не имеет значения.Имеет значение только то, что этот код загружается.Это сочетание исправления базовых библиотек и добавления бизнес-логики выглядит как нечто, что ДОЛЖНО быть подробно задокументировано (в вики проекта или что-то в этом роде).И если это задокументировано, то это не имеет значения.Код - это то, где в документации сказано, что это так.

Это не так, вот предложение по дизайну:

, когда пользователь ищет семейство Family.find(params[family_id],session[:company_id]), эта находка будет сравниватьсяКомпания из семейного результата family.company с параметром

Почему бы не сделать что-то подобное:

family = current_company.families.find(params[:family_id])

, где current_company можно определить как @current_company ||= Company.find(session[:company_id])

Здесь, если у этой компании нет этого семейства, вы получите исключение.

Тот же эффект *, только без каких-либо исправлений.Гораздо более будущее.Вы даже можете добавить пару правил rubocop, чтобы никогда не писать голые Family.find.


* не похоже, что вы добавляете этот патч, а остальная часть вашего кода волшебным образом приобретает сверхспособности.Нет. Вам все еще нужно изменить всех искателей, чтобы передать идентификатор этой компании.

0 голосов
/ 30 ноября 2018

Впервые вижу такой случай :).Я бы положил его в app/core_extensions и проверил, правильно ли с ним работает живая перезагрузка.Если нет, я бы переместил его на lib/.(Это просто эвристика)

Редактировать:

Вместо расширения NilClass Я бы лучше использовал обычные объекты NullObject.Это действительно менее удивительно и проще для понимания.

https://robots.thoughtbot.com/rails-refactoring-example-introduce-null-object

...