如何在Rails中同时保存多个has_many对象?

时间:2011-03-07 11:16:14

标签: ruby-on-rails save has-many-through

我有两个相关的模型如下。

USERS
has_many :celebrations
has_many :boards, :through => :celebrations

BOARDS
has_many :celebrations
has_many :users, :through => :celebrations


CELEBRATIONS
:belongs_to :user
:belongs_to :board

在我的控制器中,我想从表单数据创建对象。我这样做如下:

  @user = User.new(params[:user])
  @board = Board.new(params[:board])
if @user.save & @board.save    
   @user.celebrations.create(:board_id => @board,:role => "MANAGER")
   redirect_to :action => some_action
end

由于模型是由很多人加入的,有没有办法一次性保存它们,然后一次产生错误信息,以便它们同时显示在表格上?

2 个答案:

答案 0 :(得分:4)

这样做

@user = User.new(params[:user])
@user.boards << @board
@user.save

这将保存用户对象和与同一命令@user.save关联的板对象。它会在保存user_idboard_id的情况下创建中间庆祝记录,但在您的情况下,它可能没用,因为您需要设置庆祝表的其他列的值

答案 1 :(得分:2)

你的方法看起来很标准。回答你的问题...

使用关联时,<<运算符与create方法基本相同,除了:

  • <<使用交易。 create没有。
  • <<触发:before_add和:after_add回调。 create没有。
  • <<如果成功则返回关联代理(实质上是对象集合),false不成功。 create返回已创建的新实例。

在您的情况下使用<<运算符不会让您感觉太多,因为您仍然会有多个事务。如果您希望操作中的所有数据库插入/更新都是原子的,则可以将操作包装到事务中。有关详细信息,请参阅Rails API: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html