【问题标题】:how to delay after creating record in rails在rails中创建记录后如何延迟
【发布时间】:2014-05-28 02:40:49
【问题描述】:

基本上我需要在 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 会为零,因为 self.ward_id = c.id 行是在创建新病房之前执行的,因此 self.ward_id 通常是无;/ 如何解决这个问题的任何想法都会有所帮助:)

【问题讨论】:

  • c.id 为 nil 可能比其他任何事情都更能说明您的创建失败。你有验证或任何会导致 create_ward 失败的东西吗?我假设 ward 是 has_one 关系
  • 我认为如果您提供连接WardLocation 的代码会非常有帮助。

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 rails-models


【解决方案1】:

你不需要延迟......它不会那样工作。在create 之后,您将拥有自己的记录。有时记录更有可能没有保存。如果保存失败,您可以使用.create_ward!(带有!)来引发错误。来自 API 文档:

create_association!(属性 = {})

与 create_association 相同,但如果记录无效则引发 ActiveRecord::RecordInvalid。

当然你需要捕获异常......或者不。无论哪种方式,至少在这种方式下,您都在陈述您的期望(并通过例外执行它们)。

【讨论】:

  • 酷,感谢您提醒我有关强制执行的信息 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2021-04-02
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多