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

时间:2009-06-24 07:59:24

标签: ruby-on-rails forms associations polymorphism

假设我有3个模型,CarMotorcycleTruck,并且我必须输入一些内容,例如已知的先前所有者列表,交通单,牌照等。所以我为每个(PreviousOwnersPreviousPlates等创建了一个模型,并为相关模型建立了多态关联。

问题是,如何使用一种形式输入所有这些,如下所示:

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'等作为类别,但它只是为了说明在我的情况下对多态模型的真正需求。)< / p>

感谢。

6 个答案:

答案 0 :(得分:2)

也许PresenterPattern也有帮助:

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

基本思想是创建一个演示者,其作用类似于模型并处理表单中的所有传入数据并将其分发给模型。通过这种方式,可以轻松创建多个让我们说出PreviousOwner的实例并将其附加到Car。

检查链接!

答案 1 :(得分:2)

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

  

这个功能非常棒。我有   用多态实现了这一点   协会,它的确有效!

 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 
  

不要   担心如果没有任何意义,   我只想让人们知道   accepts_nested_attributes_for有效   很好的多态   关联。谢谢Eloy!

答案 2 :(得分:1)

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

答案 3 :(得分:1)

有一个RailsCast on Complex Forms可以帮助您从多个模型构建单个表单。

答案 4 :(得分:1)

如果汽车/摩托车/卡车型号相同,则应在车型上添加类型栏。如果不是,则应使用STI(单表继承)。

但是,在我给你代码之前,需要先看看你的模型。

答案 5 :(得分:1)

通过引入Vehicle模型,您可以避免这种情况并使事情变得更简单。 Vehicle模型可以包含所有PreviousOwners,PreviousPlates等集合,然后您的Truck,Car和Motorcycle模型可以has_one Vehicle。