2010-11-24 7 views
0

У меня есть две модели:Rails - создание родительских и вложенных записей модели?

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 

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

ответ

1

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

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

В основном:

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

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

Смежные вопросы