2010-06-03 57 views
2

我建立一個Rails應用程序,它允許用戶創建引用多個其他車型的對象,創建它們,如果它們不存在,只是關聯到那些已經存在:使用accepts_nested_attributes_for有belongs_to的關聯,並使用find_or_create_by_attr行爲

# app/models/upload.rb 
class Upload < AR:B 
    belongs_to :user 
    belongs_to :observed_property 
    belongs_to :sensor 

    accepts_nested_attributes_for :observed_property, :sensor 
    validates_presence_of :observed_property, :sensor 
end 

(該協會傳感器和observed_property只是單向的,不存在的has_many返回。)

的控制器是沒有什麼特別的,只是一個標準的REST風格的七,我會認爲這在保持模型中大部分邏輯的同時可以正確地做到這一點。

代替具有用戶填寫多種不同的形式並且然後分別引用這些目的,我試圖使用accepts_nested_attributes_for將它們嵌入到使用fields_forUpload形式:

# app/views/uploads/new.html.erb 
<% form_for @upload, :url => user_uploads_path(@user) do |f| %> 
    <%= f.error_messages %> 
    <% f.fields_for :observed_property do |builder| %> 
    <fieldset> 
    <legend>Observed Property</legend> 
    <p><%= builder.label :_id, "Observed Property ID" %><br /> 
    <%= builder.text_field :_id %></p> 

    <p><%= builder.label :description %><br /> 
    <%= builder.text_area :description, :rows => 5 %></p> 
    </fieldset> 
    <% end %> 
    <% f.fields_for :sensor do |builder| %> 
    <fieldset> 
    <legend>Sensor</legend> 
    <p><%= builder.label :_id, "Sensor ID" %><br /> 
    <%= builder.text_field :_id %></p> 

    <p><%= builder.label :description %><br /> 
    <%= builder.text_area :description, :rows => 5 %></p> 
    </fieldset> 
    <% end %> 
    <%= f.submit "Submit", :class => "button" %> 
<% end %> 

然而,這並不工作,因爲沒有形式顯示用於fields_for。我想申請什麼在this answer提到,但該模型也只是無法保存,理由是缺少關聯。

我已經嘗試了幾hackish的東西,如重寫sensor=observed_property=方法和緩存哈希爲before_save,但並不覺得自己真的要做事的正確方法。

回答

2

我結束了使用下述溶液,它似乎工作。我創建了一個要求,用一個匹配的規範來定義我正在尋找的行爲。

http://gist.github.com/437939

+0

我已經更新爲Rails 4要點:https://gist.github.com/dmzza/ce9b6e660c576039afca984cda0f0aed – dmzza 2016-03-29 22:50:12

相關問題