我有两种模式:
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做到这一点?建立对话和partipiations并立即保存所有内容?
答案 0 :(得分:1)
conversation_participations
可以是UPDATE
,也可以是INSERT
。在代码实际运行之前,无法确定。即便如此,一些数据库可能缺乏对多个插入的支持。
你想要什么听起来像一个交易。可以使用任何模型的transaction
方法在Rails中创建事务,该方法需要一个块。 (并且您调用它的模型并不重要,它适用于该块中的任何数据库操作。)
基本上:
Conversation.transaction do
@conversation = Conversation.create(......)
# ...etc...
end
您需要确保数据库支持事务。您没有指定您正在使用的数据库系统,但MySQL会将事务转换为MyISAM后端的无操作。如果您使用的是MySQL,请确保您的表是InnoDB。 (我相信如果您的表是使用Rails创建的,它们将是,但最好仔细检查。)