2012-05-21 54 views
1

我在想,如果我能有一個多態關聯,也存在驗證與驗證態關聯[它甚至有可能嗎?]

比方說,我有一個business模型和address模型,address是多態

class Business< ActiveRecord::Base 
    has_one :address, as: :addressable 
    validates_presence_of :address 
end 

class Address< ActiveRecord::Base 
    belongs_to :addressable, polymorphic: true 
end 

是否可以驗證validates_presence_of :address?使用此設置創建對象時遇到問題。

比方說,第一,我創​​建一個業務對象,這樣

b = Business.new(name: "Hello23") 
b.address = Address.new(street: "House 43 BCD") 
b.save! 

這是行不通的。它給出了一個undefined method constantize for 0:Fixnum,它給出了一個錯誤是有道理的,因爲當它試圖將地址保存到db時,它找不到可尋址的id,因爲業務還沒有保存,並且沒有分配給id它。

但是這不可能從另一方的任何一方 - 我無法在沒有地址的情況下保存業務。

處理這種情況的最佳方法是什麼?

****除了這個,如果我也想對地址側的驗證這樣什麼**

validates_presence_of :addressable 

我一直在掙扎着這一切約2天。讓我們看看你有什麼想法嗎?**

回答

8

我認爲你的問題與驗證代碼無關,這是可以的。

我能大膽地建議你可能設置不正確的地址數據庫表addressable_type列整數,而不是字符串:)

+0

這不是列類型的問題,但您確信驗證代碼是正確的,這有助於我認爲「還有什麼可能是錯誤的」,我終於想到了。感謝buddy – Abid

+1

OMG你該死的正確的人..今天大約一個星期的這段代碼工作後..我被另一個奇怪的錯誤感到驚訝,只是意識到你是對的我錯誤地將地址表中的addressable_type列設置爲整數不是字符串。剛回來留下這個評論,再次感謝你:)。 – Abid

+1

沒有probs,也許接受的答案:) –

1

當然是可能的。

爲對象的創作,這應該工作:

# controller.rb 
@business = Business.new 
@business.build_address 

# view.erb 
<%= form_for @business do |f| %> 
    <%= f.fields_for :address do |address_form| %> 
    ... 
    <% end %> 
<% end %> 

又見Using build with a has_one association in rails

注意:你的模型裏,我建議你使用新的驗證格式:

class Business< ActiveRecord::Base 
    has_one :address, as: => :addressable 

    validates :address, :presence => true 
end 

希望這會有所幫助。

+0

我意識到我做了很多錯誤,你寫的關於構建方法暗示我正在尋找正確的方向。我現在對如何構建和保存activerecord對象有了更好的理解。謝謝 – Abid

相關問題