Дублирующиеся активные записи, связанные с одной модели на другую - PullRequest
0 голосов
/ 01 сентября 2011

Итак, у меня есть модель Task, модель Ticket и модель Category.

Категория has_many Задачи Билет имеет много задач Категория has_many Билеты Билет принадлежит к категории Задача принадлежит Билету Задача принадлежит к категории

Задачи, связанные с категорией, являются задачами по умолчанию для заявки, когда категория связана с заявкой. Поэтому мне нужно, чтобы задачи, связанные с категорией, дублировались и ассоциировались с заявкой при выборе категории для заявки.

Мне интересно, смогу ли я сделать что-то подобное в моей модели Ticket:

  after_create :duplicate_tasks_to_ticket
  after_update :duplicate_tasks_to_ticket

  def duplicate_tasks_to_ticket
    if self.tasks.blank?
      for task in self.category.tasks.all
        new_task = Task.new
        new_task.name = task.name
        new_task.ticket_id = self.id
        new_task.save
      end
    end
  end

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

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

На самом деле, Декстер, я прокомментировал это, когда попробовал, и теперь он работает.Так что, думаю, то, что я придумал, работает просто отлично.Если кто-то не знает, как я могу улучшить его и сделать его чище.Сейчас работает.

0 голосов
/ 01 сентября 2011

Если вы уже связываете их с категорией, почему их также нужно связать с заявкой?Если вам нужна гранулярность привязки к заявке, просто используйте эту связь, чтобы получить все задачи в категории.Привязка их к обоим просто усложняет сайт.Теперь, если вам абсолютно необходимо связать их с обоими, вы должны создать таблицу назначений для них, в которой хранятся category_id, task_id.Еще одна таблица назначений для ticket_id, task_id.Затем сохраните задачу как одну запись, как предполагается, для дублирования данных.

Ваш код выглядит нормально по большей части.Я не думаю, что вам нужно все в конце.Ассоциации будут автоматически загружать все, на что вы ссылаетесь в этой модели.

Хотя попробуйте вместо этого использовать метод построения ассоциации:

def duplicate_tasks_to_ticket
  if self.tasks.blank?
    for task in self.category.tasks.all
      self.tasks.build(:name => task.name)
    end
    self.save
  end
end

Сборка создает новый объект этой ассоциации, назначаявнешний ключ для вас.Затем вы просто вызываете save для родительской модели, и она выполнит все правильные операторы вставки.

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