Ich bin mir nicht sicher über den besten Weg, dieses Szenario anzugehen und würde eine Richtung zu schätzen wissen. Im Wesentlichen habe ich ein Szenario, in dem ich Assets für eine Organisation erfassen muss.Polymorph, STI oder andere
Es gibt verschiedene Arten von Vermögenswerten so die Attribute von Typ unterscheiden sich jedoch auf den Typ gibt es eine Reihe von Feldern, auf alle Vermögenswerte gemeinsam wie:
location
make
model
colour
purchase_date
warranty_period
Ähnlich: How to design a product table for many kinds of product where each product has many parameters
Ich hatte durch die Schaffung von dieser als
one-to_many between Organisation and Asset
polymorhpic between Asset and Details
class Organisation < ApplicationRecord
has_many :assets
end
class Asset < ApplicationRecord
belongs_to :organisation
belongs to :detail, polymorphic: true
end
class CarAsset < ApplicationRecord
has_one :asset, as: :detail
end
class ComputerAsset < ApplicationRecord
has_one :asset, as: :detail
end
Meine Frage ist: Ich möchte das Asset & Detail in einer einzigen Formularaktion erstellen, so dass der Benutzer nach Auswahl des Assettyps für beide Modelle einen einzigen Formulareintrag erstellt.
Der Benutzer würde einen Link auf der Organisation zeigen Seite klicken:
<%= link_to "New car asset", new_organisation_asset_path(@organisation, query: :new_car_asset) %>
Die in meinem Controller ich etwas Ähnliches tun könnte:
class AssetsController < ApplicationController
def new
@organisation = Organisation.find(params["organisation_id"])
@asset = @organisation.assets.new
case params[:query]
when "new_car_asset"
@details = @asset.car_assets.new
when "new_computer_asset"
@details = @asset.computer_assets.new
end
end
end
Aus meiner Sicht habe ich auch den Wert überprüfen könnten, von params [: query] und rendert das entsprechende Formular partiell, das sich auf den Asset-Typ bezieht.
Geht dies auf den richtigen Weg oder gibt es einen besseren Weg, dies zu erreichen? Es fühlt sich ziemlich klobig an.