Rails - Создание записей родительской и вложенной модели? - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть две модели:

class Conversation < ActiveRecord::Base
    has_many :conversation_participations
end

class ConversationParticipation < ActiveRecord::Base
  belongs_to :user
  belongs_to :conversation
end

Прямо сейчас я делаю записи, выполняя что-то вроде:

  @conversation = Conversation.create(......)
  conversation = @conversation.save

   params[:users].each do |user|
     @user = User.find(user.to_i)
     conversation_participation = @recipient.conversation_participations.find_or_create_by_conversation_id(@conversation.id)
     conversation_participation.save
    end

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

1 Ответ

1 голос
/ 24 ноября 2010

conversation_participations является либо UPDATE, либо INSERT. Нет никакого определения, пока код на самом деле не работает. И даже в некоторых базах данных может отсутствовать поддержка нескольких вставок.

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

В основном:

Conversation.transaction do
  @conversation = Conversation.create(......)
  # ...etc...
end

Вы хотите убедиться, что ваша база данных поддерживает транзакции. Вы не указали, какую систему баз данных вы используете, но MySQL, например, превращает транзакции в no-ops для бэкэнда MyISAM. Если вы используете MySQL, убедитесь, что ваши таблицы InnoDB. (Я считаю, что если ваши таблицы были созданы с использованием Rails, они будут созданы, но лучше всего дважды проверить.)

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