我不确定采用这种方案的最佳方法,并希望了解一些方向。基本上我有一个场景,我需要为组织记录资产。
有各种类型的资产,因此属性因类型而异,但是所有资产都有许多共同的字段,例如:
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]的值,并渲染与资产类型相关的相应表格部分。
这是正确的路径还是有更好的方法来实现这一目标?它确实感觉很笨重。
答案 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
将所有内容嵌套在组织表单中。资产模型将包含组织与每个单一细节模型之间的引用,但如果您想在视图或特殊字段中对其进行更多操作,则所有内容都会分开。