2017-08-21 2 views
1

Je ne suis pas sûr de la meilleure façon d'aborder ce scénario et apprécierais une certaine direction. Essentiellement, j'ai un scénario dans lequel je dois enregistrer les actifs d'une organisation.Polymorphique, STI ou autre

Il existe différents types d'actifs de sorte que les attributs diffèrent d'un type à cependant, il existe un certain nombre de domaines communs à tous les actifs tels que:

location 
make 
model 
colour 
purchase_date 
warranty_period 

similaires à: How to design a product table for many kinds of product where each product has many parameters

j'avais grâce à la création de ce que

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 

Ma question est: Je souhaite créer le détail & de l'actif dans une seule action de formulaire afin que l'utilisateur après avoir sélectionné le type d'actif crée une seule entrée de formulaire pour les deux modèles.

L'utilisateur cliquer sur un lien sur la page show d'organisation:

<%= link_to "New car asset", new_organisation_asset_path(@organisation, query: :new_car_asset) %> 

Le dans mon contrôleur que je pouvais faire quelque chose de similaire à:

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 

À mon avis, je pourrais aussi vérifier la valeur de params [: query] et rend le formulaire correspondant partiel qui se rapporte au type d'actif.

Est-ce que cela va dans le bon sens ou existe-t-il un meilleur moyen d'y parvenir? Il se sent tout à fait maladroit.

Répondre

0

Je pense qu'il serait peut-être préférable d'utiliser has_many :trough, devrait tirer le meilleur parti à long terme. Comme ceci:

class Organisation < ApplicationRecord 
    has_many :cars, through: assets 
    has_many :cumputers, through: assets 
    has_many :locations, through: assets 
    has_many :purchase_date, through: assets 
end 

class Asset < ApplicationRecord 
    belongs_to :organisation 
    belongs_to :cars 
    belongs_to :cumputers 
    belongs_to any :locations 
    belongs_to :purchase_date 
end 

class Car < ApplicationRecord 
    has_one :organisation, through: assets 
end 

class Cumputer < ApplicationRecord 
    has_one :organisation, through: assets 
end 

class Location < ApplicationRecord 
    has_one :organisation, through: assets 
end 

class Purchase_date < ApplicationRecord 
    has_one :organisation, through: assets 
end 

Ensuite, vous pouvez créer des actifs au sein Organisations_controller et peut tout nid sous forme Organisation fields_for. Le modèle des assets contiendrait des références entre l'organisation et chaque modèle de détail, mais tout serait seperate si vous en faisiez plus avec des vues ou des champs spéciaux.