假设我有3个模型,Car
,Motorcycle
和Truck
,并且我必须输入一些内容,例如已知的先前所有者列表,交通单,牌照等。所以我为每个(PreviousOwners
,PreviousPlates
等创建了一个模型,并为相关模型建立了多态关联。
问题是,如何使用一种形式输入所有这些,如下所示:
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>
感谢。
答案 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。