2011-01-30 63 views
5

假設我有兩個模型,Director和Movie,以及第三個連接模型稱爲Directions。他們被定義爲這樣的:創建或更新與has_many的關聯:通過

電影:

class Movie < ActiveRecord::Base 
    has_many :directions 
    has_many :directors, :through => :directions 
end 

導演:

class Director < ActiveRecord::Base 
    has_many :directions 
    has_many :movies, :through => :directions 
end 

路線:

class Direction < ActiveRecord::Base 
    belongs_to :movie 
    belongs_to :director 
end 

當我創建了一部電影,我希望能夠使用提供的信息(名稱和imdb_id)創建導演,或者根據imdb_id找到現有導演並將其與電影記錄關聯。

本質上,我不想刪除或編輯導演。我只想創建一個新的導演,如果他不存在基於他的imdb_id,或者在創建或編輯電影時與一個預先存在的導演相關聯。

我的問題是,我如何鏈接所有這一切在視圖/控制器?

accepts_nested_attributes_for工作正常除了當你編輯的電影,我不希望你其實可以編輯導演的名字。我絕對沒有興趣更新/銷燬實際的董事,只有協會。

回答

3

你的電影實例有一個director_ids數組,其中包含關係的id。 所以,你可以很容易地列出例如,所有各董事複選框,並要求用戶檢查關係...

<% Director.all.each do |director| %> 
    <%= check_box_tag 'movie[director_ids][]', director.id, @movie.directors.include?(director) %> 
    <%= director.name # or whatever (title, etc) %> 
<% end %> 

<%= hidden_field_tag 'movie[director_ids][]', '' %> 

(該hidden_​​tag是當用戶取消所有的箱子,讓director_ids將是空的。 )

+0

謝謝,這讓我在那裏。我最終會有幾個導演(數百人),所以顯示他們都不行,但我可以通過一些AJAX搜索魔法來解決這個問題。 我有一個特定的使用案例,我不知道如何實現。比方說,我和史蒂文斯皮爾伯格一起創作了一部電影作爲導演。然後我意識到他沒有真正引導它,但詹姆斯卡梅隆做到了,我還沒有詹姆斯卡梅隆在數據庫中。通過您的解決方案,我可以取消選中Steven Spielberg,但我將如何添加James Cameron並創建Director DB記錄和關聯? 謝謝! – 2011-01-31 00:59:01