#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