【发布时间】:2010-04-20 03:20:14
【问题描述】:
在 Rails 中,当保存一个 active_record 对象时,它的关联对象也会被保存。但是 has_one 和 has_many 关联保存对象的顺序不同。
我有三个简化模型:
class Team < ActiveRecord::Base
has_many :players
has_one :coach
end
class Player < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
class Coach < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
我希望当team.save 被调用时,球队应该在其相关教练和球员之前被保存。
我使用以下代码来测试这些模型:
t = Team.new
team.coach = Coach.new
team.save!
team.save! 返回真。
但在另一个测试中:
t = Team.new
team.players << Player.new
team.save!
team.save! 给出以下错误:
> ActiveRecord::RecordInvalid:
> Validation failed: Players is invalid
我发现team.save! 按以下顺序保存对象:1) 球员、2) 球队和 3) 教练。这就是我收到错误消息的原因:保存玩家时,团队还没有 id,所以validates_presence_of :team_id 在玩家中失败。
有人可以向我解释为什么对象按此顺序保存吗?这对我来说似乎不合逻辑。
【问题讨论】:
-
使问题更明确:当 team.save!被调用,是否可以在玩家对象之前将团队对象保存到数据库中?
标签: ruby-on-rails activerecord