Как проверить объект обслуживания в Rails?

#ruby-on-rails #ruby #validation #service

Вопрос:

У меня есть этот класс обслуживания, и мне нужно проверить следующие свойства key , url которые на самом деле работают в другой модели.

     class MobileInstallationService
      class << self
        def connected?(id)
          # do something to @mi
        end

        def track_usage?(id)
          # do something to @mi
        end

        private

        def load_installation(id)
          @mi = Installation.find id
        end
      end
    end
 

Установки могут быть разных типов, поэтому у меня есть модель Installation , которая отслеживает их, т. Е. Все операции CRUD, и на каждой установке будет properties hstore, который будет сильно отличаться.

 class Installation

  belongs_to :user
  validates user, presence: true

end
 

Вот пример этого объекта установки с двумя свойствами, которые мне нужно проверить:

 => #<Installation id: 25, user_id: 8, created_at: "2021-07-22 22:35:10", updated_at: "2021-07-22 22:35:25", user_id: 16, properties: {"key"=>"123", "url"=>"www.google.com"}>
 

Однако различные типы установок имеют очень мало общего с точки зрения конкретных методов, используемых на них (например, у этого есть connected? метод, а у других его нет).
Вот почему я не хочу связывать родительский контроллер, который выполняет все проверки CRUD, например, там:

 class InstallationController < SomeController
  before_action :load_installation

  def show
  end

  def update
      # could validate here but this class doesn't need to know about specific types
      # of installation - so I don't want to introduce coupling
      @installation.update(properties: params[:properties])
    end
  end

  private
    def load_installation
      @installation = Installation.find(id)
    end
end
 

И форма, которую я создал, требует экземпляра основного класса установки, @installation т. Е. В идеале мне нужно что-то сделать с submit действием

 = form_for @installation, url: installation_path(@installation.id), method: :put do |f|

  %button {type: "submit"} SAVE
    = fields_for :settings do |s|
      = s.text_field :key
      = s.text_field :url
 

Комментарии:

1. Вы пробовали использовать наследование одной таблицы?

2. Много лет назад я создал многозадачный камень наследования для ruby. Я очень сомневаюсь, что это сработает сегодня, так как я его не поддерживал. 🙂 github.com/mhuggins/multiple_table_inheritance