2017-08-21 5 views
1

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.

Antwort

0

Ich denke, es wäre vielleicht besser, has_many :trough zu verwenden, sollte auf lange Sicht mehr davon bekommen. Wie folgt aus:

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 

Dann können Sie Assets innerhalb Organisations_controller erstellen und können in Organisationsform Nest alles mit fields_for. Das Anlagenmodell würde Referenzen zwischen der Organisation und jedem einzelnen Detailmodell enthalten, aber alles wäre getrennt, wenn Sie in Sichten oder speziellen Feldern mehr damit machen würden.