Rails - 创建父母&嵌套模型记录?

时间:2010-11-24 17:12:50

标签: ruby-on-rails ruby-on-rails-3

我有两种模式:

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并立即保存所有内容?

1 个答案:

答案 0 :(得分:1)

conversation_participations可以是UPDATE,也可以是INSERT。在代码实际运行之前,无法确定。即便如此,一些数据库可能缺乏对多个插入的支持。

你想要什么听起来像一个交易。可以使用任何模型的transaction方法在Rails中创建事务,该方法需要一个块。 (并且您调用它的模型并不重要,它适用于该块中的任何数据库操作。)

基本上:

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

您需要确保数据库支持事务。您没有指定您正在使用的数据库系统,但MySQL会将事务转换为MyISAM后端的无操作。如果您使用的是MySQL,请确保您的表是InnoDB。 (我相信如果您的表是使用Rails创建的,它们将是,但最好仔细检查。)