Ruby on rails 如何在Rails中以相同的形式访问和提交相关的多态模型?

Ruby on rails 如何在Rails中以相同的形式访问和提交相关的多态模型?,ruby-on-rails,forms,associations,polymorphism,Ruby On Rails,Forms,Associations,Polymorphism,假设我有3个模型,汽车,摩托车和卡车,对于每一个模型,我都必须输入一系列信息,例如已知的前车主列表、交通罚单、车牌等。因此我为每个模型创建了一个模型(前车主,前车牌,等等)并为相关模型建立多态关联 问题是,我如何只使用一个表单输入所有这些内容,类似这样: Car #123 Known previous owners: Jason Jazz Brian Bass [add another] Known previous license plates: 12345 67890 [add anot

假设我有3个模型,
汽车
摩托车
卡车
,对于每一个模型,我都必须输入一系列信息,例如已知的前车主列表、交通罚单、车牌等。因此我为每个模型创建了一个模型(
前车主
前车牌
,等等)并为相关模型建立多态关联

问题是,我如何只使用一个表单输入所有这些内容,类似这样:

Car #123

Known previous owners:
Jason Jazz
Brian Bass [add another]

Known previous license plates:
12345
67890 [add another]

Current status:
Cleared 
(this is a dropdown select menu, CurrentStatus is also a polymorphic association, but with predefined values.)

etc
这被证明是个婊子,远远超出了我的专业水平(这里是新手)。这些资源不是嵌套的,我在多个模型上找到的几乎所有东西都是嵌套的资源,并且似乎没有任何东西适用于多态关联

(这只是一个例子,我知道理想情况下我应该有一个
Vehicle
模型,并将“Car”等作为类别,但这只是为了说明在我的例子中对多态模型的真正需要。)


谢谢。

很好,嵌套表单生成器不必与嵌套资源关联。您也可以发布模型代码吗?

有一种方法可以帮助您从多个模型构建单个表单

如果汽车/摩托车/卡车型号相同,则应在车型中添加“类型”列。如果不是,您应该使用STI(单表继承)


但是,是的,我需要先查看您的模型,然后才能给您代码。

也许PresenterPattern也很有用:

其基本思想是创建一个演示者,该演示者的行为类似于模型,处理来自表单的所有传入数据并将其分发给模型。通过这种方式,也很容易创建多个lets实例,比如PreviousOwner,并将其附加到汽车上


查看链接

您可以在Rails 2.3中使用新的嵌套属性,但是您必须以某种方式编写它才能使其正常工作。诀窍在于,您需要创建实际的多态对象,然后构建包含“属于多态”子句的类。这是我发现的一个例子,由一个名为:Superslau的用户发布(我在这里已经清理了很多):

这个功能真是太棒了。我有 用多态性实现了这一点 协会,它的工作

不要 担心如果这没有任何意义, 我只是想让人们知道这一点 接受工程的\u嵌套\u属性\u 多形性很好 协会。谢谢你,伊洛伊


您可以通过引入车型来避免这种情况,并使事情变得更简单。车辆模型可以拥有您所有的旧车主、旧车牌等集合,然后您的卡车、汽车和摩托车模型可以拥有一辆车。

Rails“new”接受“stuff”的嵌套属性,这不是过时了吗?它可以一种方式工作,但不能另一种方式工作。你的情况根本没有什么不同,因为上传知道它只有任务要处理。换一种方式尝试是不可能的,因为“属于”关系是多态的,从逻辑上讲,rails不知道如何确定要创建什么。我也有点喜欢这个。
 class Task < ActiveRecord::Base
   has_many :assets, :dependent=>:destroy
   accepts_nested_attributes_for :assets, :allow_destroy => true
   belongs_to :workable, :polymorphic => true
 end



 class Upload < ActiveRecord::Base
   has_one :task, :as => :workable, :dependent=>:destroy
   accepts_nested_attributes_for :task, :allow_destroy => true 
 end
 def new   
  @upload = Upload.new  
  @upload.task = Task.new  
  @upload.task.assets.build 
 end