0

我有兩個模型,我目前擁有STI。如何建立可以相互轉換,但具有不同關聯的這些對象類型的模型

class Event 
class BlockedTime < Event 
class Appointment < Event 

型號有不同之處在於「約會」 HAS_ONE「客戶」和HAS_ONE「服務」相似,而「BlockedTime」既沒有這些關聯的。

此外,我希望能夠輕鬆地在兩種類型之間進行轉換,並且當我搜索時,我通常一起搜索兩種類型,而不是一種或另一種。由於這些原因,我不願意把它們分開放置。

爲了在兩種類型之間切換,我目前使用父'Event'類型,並將'type'作爲隱藏字段以相同的形式進行切換,但這絕對不能很好地工作。我必須在控制器中進行各種轉換以檢查驗證等。

您會如何建議對此進行建模?

+0

你真的需要它們成爲單獨的模型嗎?看起來像一對夫婦會做的。 –

+0

你可以擴展嗎?當一些記錄沒有記錄時,我將如何處理has_one關聯的情況? – 99miles

+0

只是想大聲。我從來沒有使用STI,所以我可能是錯的。沒關係:) –

回答

1

所以,如果我有這個問題,我可能會建立不同的數據庫模型。

而不是一個STI /繼承模式,我會使用組成模式。所以:

class Appointment 
    belongs_to :block_time, :class_name => "BlockTime" 
    ... 
end 

class BlockTime 
    has_one :appointment 
    accepts_nested_attributes_for :appointment, :allow_destroy => :true, 
               :reject_if => :all_blank 

    ... 
end 

控制器

class AppointmentsController < ApplicationController 
    ... 

    def new 
    @block_time = BlockTime.new 
    @block_time.appointment or @block_time.build_appointment 
    ... 
    end 

    def edit 
    @block_time = BlockTime.includes(:appointment).find(params[:id]) 
    @block_time.appointment or @block_time.build_appointment 
    end 

    ... 
end 

或形式中的至少一部分

<%= f.fields_for :appointment do |g| %> 
    <div> 
    <%= g.radio_button :_destroy, "1", :checked => !g.object.persisted? %> 
    <%= g.label :_destroy_1, "Has no Appointment" %> 

    <%= g.radio_button :_destroy, "0", :checked => g.object.persisted? %> 
    <%= g.label :_destroy_0, "Has Appointment" %> 
    </div> 

    <p> 
    Client: <%= g.text_field :client %> 
    </p> 
<% end %> 

表格中的這一部分使用persisted?檢查,看看是否Appointment對象是新記錄或已被保存到數據庫。然後,如果它已經被刪除並且您想刪除它,那麼它將拋出_destroy標誌爲accepts_nested_attributes_for並刪除現有的appointment關聯使其成爲免費BlockTime

然後,您也可以在此表單中包含所有Appointment字段。 你可能想煮一些JavaScript來禁用/啓用字段,具體取決於radio_button選擇

+0

謝謝,但BlockTime由什麼組成,只是日期/時間?而這似乎並沒有解決沒有客戶端,服務協會的封鎖時間的關聯問題,還是我錯過了某些東西? – 99miles

+0

因此'BlockTime'只會存儲任何相關的日期/時間信息以及外鍵「appointment_id」。然後一個'Appointment'將保存客戶端和服務數據。實際上'Appointment'將取決於'BlockTime',但是'BlockTime'也可以是獨立的記錄。 – Azolo

+0

如果BlockTime belongs_to:約會,它不能自己存在,可以嗎? – 99miles

相關問題