1

更新:考慮到這一點後,我認爲這個問題包括多態性和STI。Rails多態/單表繼承模型,選擇類型的形式

比方說,我有以下幾點:

class Vehicle < ActiveRecord::Base 
    belongs_to :dealership 
    ... 
end 

class Car < Vehicle 
    ... 
end 

class Truck < Vehicle 
    ... 
end 

汽車和卡車模型在模型相同的屬性,但不同的邏輯,所以他們都只是使用車輛表。

我想製作一個通用表格,允許有人創建一個新的車輛記錄,並選擇它是「汽車」還是「卡車」。在後端,此表單應該創建「汽車」或「卡車」記錄,而不是通用的「車輛」記錄。

問題: 如何在Rails表單中顯示此選項?具體來說,是否有方法列出抽象基本模型的子類型,和/或是否有一種簡單方法將這些類型顯示爲(例如)表單中的Select元素?

我希望創造一種能夠使汽車或卡車反對只有兩種不同形式的汽車和卡車的形式,最終我還希望這些模型嵌套在父母身上,「經銷商「。我希望能夠不僅創建新車輛並選擇「汽車」或「卡車」作爲選項,而且還可以嵌套表格,用戶可以加載「經銷商」並查看/編輯所有汽車以及以單一形式屬於該經銷商的卡車。我知道如何使用accepts_nested_attributes_forVehicle belongs_to :dealership這樣的簡單關聯進行設置,但我不確定如何爲從Vehicle繼承的子模型進行設置。

回答

0

我可能是錯的,但我理解polymorphic作爲其他方式。我的意思是,一個模型可以屬於多個其他模型...

CarTruck是一種Vehicle。所以,可以說Vehicle具有yearmark屬性。

您可以創建新的CarTruck,並且已定義多態性,您將像往常一樣創建表單。

@car = Car.find(id) 
@vehicle = @car.vehicles.build(year: "1999", mark: "Beetle") 
@vehicle.save 

我希望它可以幫助...

+0

你知道嗎,我其實在看多態和STI,當我最初寫這個問題的時候,我把他們混淆在我腦海中。感謝您的反饋! – Andrew 2012-07-22 20:36:09

+0

是的,我明白你的意思了。我想我找到了一個有用的鏈接:http://stackoverflow.com/questions/5047613/rails-model-inheritance-in-forms – gabrielhilal 2012-07-22 20:55:42

0

我不認爲在表格上簡單的選擇元素是解決你的問題。你在這裏試圖實現的是Multiple Table Inheritance,你的問題應該是你必須構建模型的方式,以便在數據庫中輕鬆地反映出來。因爲這是一個長時間的討論,我會告訴你this article在哪裏我解釋這樣做的最佳方式。我希望我以某種方式幫助你:)

PS:要回答你的問題,沒有在Rails框架中做這種事情的內建機制。

+0

感謝您的文章鏈接,看起來像它解決類似的問題。我會看一看。 – Andrew 2012-07-22 20:35:25

1

我有同樣的問題。基本上你試圖構建一個接受基類的關聯的表單,但是你想爲任何的Decorated/Concrete類動態地創建單獨的表單(添加嵌套字段)。

我使用cocoon gem解決了這個問題,它提供了將正確字段動態添加到表單的方法。該_form部分看起來像:

# _form.html.haml 

= simple_form_for @dealership, :html => { :multipart => true } do |f| 

    = f.simple_fields_for :vehicles do |vehicle| 
    = render 'vehicle_fields', :f => vehicle 
    = link_to_add_association 'Add a Car', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Car.new } 
    = link_to_add_association 'Add a Truck', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Truck.new } 

= f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save' 

然後是_vehicle_fields

# _vehicle_fields.html.haml 

- if f.object.type == 'Car' 
    = render 'car_fields', :f => f 
- elsif f.object.type == 'Truck' 
    = render 'truck_fields', :f => f 

car_fieldstruck_fields也將配備由cocoon

提供的鏈接link_to_remove_association:wrap_object文檔看看https://github.com/nathanvda/cocoon,或閱讀我的博客文章http://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations