Вызов действителен? на новые записи, но игнорировать действительность построенных ассоциаций - PullRequest
2 голосов
/ 15 февраля 2011

У меня есть три таблицы: задачи, отделы и задачи отдела. Мне нужно назвать "действительным?" на новых объектах задачи, но я хочу игнорировать валидность любых «встроенных» отделов. Мы делаем массовые загрузки, поэтому загружаем все или ничего.

Когда мы перебираем файл Excel, который читаем, мы строим новую «Задачу» в соответствии со значениями в каждой строке. С каждой строкой может быть связанный отдел для задачи; если есть, мы «строим» связанный объект Department_task следующим образом:

new_task.department_tasks.build(:department_id => d.id)

В конце цикла мы проверяем валидность нового объекта «задача», вызывая «valid?»

new_task.valid?

Если задание выполнено, оно попадает в «хорошую» кучу; если это плохо, это идет на «плохую» кучу.

Проблема в том, что мы не сохранили задачу, и поэтому она не имеет: id. Без идентификатора «встроенная» служба Department_task недопустима (должны присутствовать и: отдела_id, и: задачи_ид.).

Мне нужно знать, как я могу назвать «действительным»? или проверить правильность объекта «new_task» без проверки каскадом вниз к связанному объекту «task_department», который не может быть действительным до сохранения задачи.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Вы можете пропустить отдельные проверки, используя :if или :unless

validates_presence_of :department_id,
  :unless => lambda { |record| record.new_record? }

Если я правильно понимаю, у вас есть что-то вроде этого:

class Task < ActiveRecord::Base
  has_many :department_tasks
  has_many :departments, :through => :department_tasks
  validates_associated :department_tasks
end

class DepartmentTask < ActiveRecord::Base
  belongs_to :task
  belongs_to :department
  validates_presence_of :department_id, :task_id
end

Когда Task является новым, связанная проверка в DepartmentTask завершается неудачей, потому что task_id равен nil. Правильно?

Я не вижу простого способа обойти это. Наиболее очевидное решение - просто удалить validates_presence_of для task_id. Если единственный способ, которым вы создаете DepartmentTasks, - это построить их с помощью Task model, валидацияsence_of кажется ненужной, поскольку Rails всегда добавляет task_id при сохранении Задачи.

Другой вариант - заключить его в транзакцию, создать новую задачу (чтобы она имела идентификатор), затем создать и проверить DepartmentTask и выполнить откат, если он недействителен.

0 голосов
/ 15 февраля 2011

Вы должны назначить объект вашим запросам AR, чтобы проверить его действительность, также используйте .new(:department_id => d.id)

myrecord = new_task.department_tasks.new(:department_id => d.id)
if myrecord.save!
 "good pile"
else
 "bad pile"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...