多态,STI或其他

时间:2017-08-21 08:36:10

标签: ruby-on-rails polymorphic-associations

我不确定采用这种方案的最佳方法,并希望了解一些方向。基本上我有一个场景,我需要为组织记录资产。

有各种类型的资产,因此属性因类型而异,但是所有资产都有许多共同的字段,例如:

location
make
model
colour
purchase_date
warranty_period

类似于: How to design a product table for many kinds of product where each product has many parameters

我已经将其创建为

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

我的问题是: 我希望创建资产&amp;单个表单操作中的详细信息,因此用户在选择资产类型后会为两个模型创建单个表单条目。

用户可以点击组织展示页面上的链接:

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

在我的控制器中,我可以做类似的事情:

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

在我看来,我还可以检查params [:query]的值,并渲染与资产类型相关的相应表格部分。

这是正确的路径还是有更好的方法来实现这一目标?它确实感觉很笨重。

1 个答案:

答案 0 :(得分:0)

我认为使用has_many :trough可能会更好,从长远来看应该从中获得更多。像这样:

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

然后,您可以在Organisations_controller中创建资产,并可以使用fields_for将所有内容嵌套在组织表单中。资产模型将包含组织与每个单一细节模型之间的引用,但如果您想在视图或特殊字段中对其进行更多操作,则所有内容都会分开。