ActiveRecord Callback - Как создать новую запись на основе только что сохраненной записи? - PullRequest
1 голос
/ 04 августа 2010

Мне нужна помощь в том, что я считаю ActiveRecord Callback.

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

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

Пример:

0) У меня есть таблица под названием «ссылки», в которой будут храниться люди, связанные с другими людьми. Это выглядит так:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+

1) Пользователь веб-приложения введет имя отправителя и получателя (который отправляет или получает ссылку). На данный момент "person_id" пусто:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
| 1  |           | 5             | 10          |
+----+-----------+---------------+-------------+

2) Перед сохранением записи мне нужно скопировать значение «origin_person» в столбец «person_id»:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
| 1  | 5         | 5             | 10          |
+----+-----------+---------------+-------------+

3) Наконец, после сохранения записи мне нужно сохранить дубликат записи, но со значением «rcvd_person», скопированным в «person_id»:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
| 1  | 5         | 5             | 10          |
+----+-----------+---------------+-------------+
| 2  | 10        | 5             | 10          |
+----+-----------+---------------+-------------+

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

Я бы предпочел оставить все это вне Rails View, так как я не хочу скрытых полей и того, что не висит вокруг.

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

1 Ответ

1 голос
/ 04 августа 2010

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

Что-то вроде:

def Link
  after_create :duplicate_link
  attr_accessible :stop_duplication

  private
  def duplicate_link
    unless stop_duplication
      new_link = Link.new
      # set all the link attrs here
      new_link.stop_duplication = true
      new_link.save
    end
  end
end

(конечно, этот код не тестировался, я просто хотел проиллюстрировать, как это можно сделать)

При этом я бы действительно подумал, почему и если мне нужен такой тип поведения.Мне кажется, что-то еще может быть не так, если вам это нужно.

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