ruby-on-rails – activerecord如何知道执行插入或更新?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – activerecord如何知道执行插入或更新?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
也许一些红宝石专家可以看出,在调用save()时,activerecord如何知道进行插入或更新.它背后的逻辑是什么?它是否检查主键是空白还是某些东西,如果是插入,如果不是更新?

解决方法

虽然有些人说“RTFM”可以说是更加漫长而又完全无用的Rails-3-out-and-changes的一切回应:

它在Rails 2.3(又名“今天”)中如何工作

save电话create_or_update看起来像这样:

def create_or_update
  raise ReadOnlyRecord if readonly?
  result = new_record? ? create : update
  result != false
end

您可以忽略此方法的第一行,因为它只会在记录为只读方式时引发错误(通常不是,但在连接的情况下可能是).我们在这里感兴趣的是方法中的第二和第三行.

第二行呼叫new_record?,定义如下:

# Returns true if this object hasn't been saved yet -- that is,a record for the object doesn't exist yet; otherwise,returns false.
  def new_record?
    @new_record || false
  end

而变量@new_record设置为initialize(新调用初始化,并给我们一个新对象,这里的一些背景Ruby-fu)方法调用.

所以如果这个@new_record是真的,它会调用create,如果它是假的,它会调用update,这使我们得到你所追求的,我想.

此外,当您找到记录时,它不调用initialize,因此不设置@new_record.如果你注意到,new_record背后的代码?是@new_record ||如果没有设置@new_record,则返回false.

比方说,你想找到最后一个论坛记录,所以你可以做Forum.last.

>这个调用last方法在Forum类上继承自ActiveRecord :: Base
>上一个callsfind方法.
>找到calls find_last
> find_last calls find_initial
> find_initial calls find_every
> find_every calls find_by_sql
>和find_by_sql电话instantiate

你会在这里看到,这个变化没有地方是@new_record设置,因此通过find获得的任何记录都不会是新的记录.

希望这有助于您理解.

原文链接:https://www.f2er.com/ruby/272064.html

猜你在找的Ruby相关文章