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_id
和 board_id
,但在您的情况下,它可能没有用,因为您需要设置庆祝表其他列的值
【讨论】:
【参考方案2】:你的方法对我来说看起来很标准。回答你的问题...
使用关联时,<<
运算符与create
方法基本相同,除了:
<<
使用事务。 create
没有。
<<
触发 :before_add 和 :after_add 回调。 create
没有。
<<
如果成功则返回关联代理(本质上是对象的集合),false 则不成功。 create
返回创建的新实例。
在您的情况下使用 <<
运算符不会给您带来太多好处,因为您仍然会有多个交易。如果您希望操作中的所有数据库插入/更新都是原子的,您可以将操作包装到事务中。有关详细信息,请参阅 Rails API:
http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
【讨论】:
<<
与创建方法不同。它只是将对象添加到 :has_many 关联的数组中。然后,在保存用户对象时,相关对象将保存在数据库中(如果通过了验证)。 create
如果所有验证通过,则创建记录并将其保存在数据库中。
有没有办法使用上面的@user.save 为连接表包含一些属性
非常感谢。我也在找:)
目前我有@user.save 和@board.save。问题是如果@user.save 生成错误消息@board.save 没有运行,所以我没有收到该模型的错误消息。我希望同时显示所有错误消息。
@chell...您可以使用 & 代替 && 。如果 (@user.save & @board.save) 。您将检查这两个条件。以上是关于Rails中如何通过对象同时保存多个has_many?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mongoose/Node.js 中同时保存多个文档?