基本上我需要在after_save :: create ward
之后创建一个关联Location.rb
after_save :createward
def createward
w = Ward.find_by_name(self.city)
if w.nil?
c = self.create_ward({:name => self.city})
self.ward_id = c.id #this line should be delayed because - c.id is called to soon.
else
self.ward_id = w.id
end
end
这种工作,大部分时间它会创建或关联记录,但有时c.id将为nil,因为self.ward_id = c.id行在创建新病房之前执行,因此self.ward_id通常是零; / 任何想法如何解决这个问题都会有所帮助:)
答案 0 :(得分:1)
你不需要延迟......它不会那样工作。 create
之后你已经有了你的记录。记录有时候更有可能无法保存。如果保存失败,您可以使用.create_ward!
(带!
)来引发错误。来自API文档:
create_association!(attributes = {})
与create_association相同,但如果记录无效,则会引发ActiveRecord :: RecordInvalid。
当然,你需要捕获异常......或者不是。无论哪种方式,至少以这种方式说明你的期望(并用异常强制执行)。