rails3: <object>.save! не ассоциирует новых детей в habtm - PullRequest
2 голосов
/ 16 марта 2012

У меня есть две модели, связанные через habtm:

class Participant < ActiveRecord::Base
 has_and_belongs_to_many :reports
end

и

class Report < ActiveRecord::Base
 has_and_belongs_to_many :participants
end

В целях обновления одного отчета можно ввести адреса электронной почты участников, чтобы связать этого участника с текущим отчетом.
Проблема: удаление участника путем удаления его адреса электронной почты в форме работает нормально, но связывание нового не работает (независимо от того, существует ли сам участник или нет).
Это код для обновления отчета:

num_of_participants = @report.participants.length
count = 0
num_of_participants.times do
 if @report.participants[count].email.empty?
  @report.participants[count].destroy
 else
  @report.participants[count] = Participant.find_or_create_by_email(@report.participants[count].email)
 end
 count += 1
end


@report.save!

Любая помощь приветствуется!
... это был мой первый пост здесь, надеюсь, все в порядке.

Ответы [ 2 ]

0 голосов
/ 17 марта 2012

Я немного запутался в том, что вы используете count и num_of_participants. Во всяком случае, вот как я бы это сделал:

В вашем представлении обновлений у вас должна быть форма, объявленная следующим образом, верно?

# views/reports/edit.html.erb
<%= form_for @report, :url => report_path(@report) do |f| -%>

Если вы это сделаете, то текстовые поля, которые вы используете для ввода своих электронных писем, должны выглядеть следующим образом:

# views/reports/edit.html.erb
<%= f.text_field :emails, :name => "emails[]" %>

Если вы используете form_tag вместо form_for, вам следует использовать text_field_tag вместо f.text_field.

Зачем ты это спрашиваешь? Ну, потому что таким образом все ваши письма будут упакованы в params[:emails]. Все они будут внутри массива, что значительно облегчит работу.

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

# controllers/reports_controller.rb
@report.participants.each do |participant|
  if !params[:emails].include?(participant.email)
    @report.participants.delete(participant)  #remove the link to the participant from the report
  end
end

Теперь нам нужно перебрать наш массив писем, и если в отчете нет пользователя с таким письмом, добавьте этого участника.

# controllers/reports_controller.rb
params[:emails].each do |email|
  participant = @report.participants.find_by_email(email)
  if participant.nil?
    @report.participants << Participant.find_or_create_by_email(email)
  end
end

И это все!

@report.save!
0 голосов
/ 16 марта 2012

Когда вы назначаете объект ассоциации has_and_belongs_to_many, этот объект автоматически сохраняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...