2011-01-30 62 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