【问题标题】:Creating or updating association with has_many :through创建或更新与 has_many 的关联:通过
【发布时间】:2011-06-18 07:05:01
【问题描述】:

假设我有两个模型,Director 和 Movie,还有一个叫做 Directions 的连接模型。它们是这样定义的:

电影:

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 工作正常除了您实际上可以在编辑我不想要的电影时编辑导演的姓名。我完全没有兴趣更新/销毁实际的董事,只有协会。

【问题讨论】:

    标签: ruby-on-rails ruby associations has-many-through


    【解决方案1】:

    您的电影实例有一个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 将为空。)

    【讨论】:

    • 谢谢,这让我成功了。我最终将拥有相当多的导演(数百名),因此将它们全部显示将不起作用,但我可以使用一些 AJAX 搜索魔法来解决这个问题,这很好。我有一个特定的用例,我不确定如何实现。假设我制作了一部由史蒂文·斯皮尔伯格担任导演的电影。然后我意识到他实际上并没有执导它,但詹姆斯卡梅隆做了,而且我还没有詹姆斯卡梅隆在数据库中。使用您的解决方案,我可以取消选中 Steven Spielberg,但我将如何添加 James Cameron 并创建 Director DB 记录和关联?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多