Создание или обновление ассоциации с has_many: через - PullRequest
5 голосов
/ 31 января 2011

Скажем, у меня есть две модели, Режиссер и Кино, и третья модель соединения, которая называется Направления. Они определены как таковые:

Фильм:

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

Когда я создаю фильм, я хочу иметь возможность создать режиссера с предоставленной информацией (name и imdb_id) или найти существующего режиссера на основе imdb_id и связать его с записью фильма.

По сути, я никогда не хочу удалять или редактировать режиссера. Я хочу иметь возможность создавать нового режиссера, только если он не существует, основываясь на его imdb_id, или связываться с уже существующим режиссером, когда я создаю или редактирую фильм.

У меня вопрос, как мне связать все это в view / controller?

accepts_nested_attributes_for отлично работает кроме вы можете редактировать имя режиссера, когда вы редактируете фильм, который мне не нужен. Я абсолютно не заинтересован в обновлении / уничтожении реальных директоров, только ассоциации.

1 Ответ

3 голосов
/ 31 января 2011

Ваш экземпляр фильма имеет массив Director_ids, который содержит идентификаторы отношений. Таким образом, вы можете легко перечислить всех директоров, например, какие флажки и попросить пользователя проверить отношения ...

<% 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][]', '' %>

(скрытый_таг - это когда пользователь снимает все флажки, так что Director_ids будет пустым.)

...