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

Posted

技术标签:

【中文标题】Rails中如何通过对象同时保存多个has_many?【英文标题】:How to save many has_many_through objects at the same time in Rails? 【发布时间】:2011-03-07 11:16:14 【问题描述】:

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

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

由于模型是由多路连接的,有没有办法一次性保存它们,然后一次生成错误消息,以便它们同时显示在表单上?

【问题讨论】:

【参考方案1】:

这样就可以了

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

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

【讨论】:

【参考方案2】:

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

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

&lt;&lt; 使用事务。 create 没有。 &lt;&lt; 触发 :before_add 和 :after_add 回调。 create 没有。 &lt;&lt; 如果成功则返回关联代理(本质上是对象的集合),false 则不成功。 create 返回创建的新实例。

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

【讨论】:

&lt;&lt; 与创建方法不同。它只是将对象添加到 :has_many 关联的数组中。然后,在保存用户对象时,相关对象将保存在数据库中(如果通过了验证)。 create 如果所有验证通过,则创建记录并将其保存在数据库中。 有没有办法使用上面的@user.save 为连接表包含一些属性 非常感谢。我也在找:) 目前我有@user.save 和@board.save。问题是如果@user.save 生成​​错误消息@board.save 没有运行,所以我没有收到该模型的错误消息。我希望同时显示所有错误消息。 @chell...您可以使用 & 代替 && 。如果 (@user.save & @board.save) 。您将检查这两个条件。

以上是关于Rails中如何通过对象同时保存多个has_many?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 在保存时创建关联对象

如何在 Mongoose/Node.js 中同时保存多个文档?

Rails 6嵌套形式茧不会保存子对象

Rails:查找嵌套关联为空的记录

如何使用 Rails 3 在同一视图中创建同一类的多个对象?

在 Rails 项目中同时保存 uuid_ossp 和 pgcrypto