gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:21:20 28 4
gpt4 key购买 nike

也许那里的一些 Ruby 专家可以阐明 activerecord知道做一个insertupdate调用save()时.其背后的逻辑是什么?它是否检查主键是否为空白或其他内容,如果是,insert , 如果不是 update ?

最佳答案

虽然有些人可以说“RTFM”,但我宁愿在 Rails-3 出现并改变一切时做出更多的演练但仍然完全无用的回应:

它在 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 时设置( new 调用 initialize ,并给了我们一个新对象,这里是一些背景 Ruby-fu)方法被调用。

所以如果这个 @new_recordtrue它会调用 create 如果它是假的,它会调用 update 我想,这让我们明白了你所追求的。

此外,当您找到一条记录时,它不会调用 initialize因此不设置 @new_record .如果你注意到了, new_record? 后面的代码是 @new_record || false ,这意味着如果 @new_record 它将返回 false没有设置。

例如,假设您要查找最后一个 Forum记录,所以你会做 Forum.last .
  • 这调用了 last Forum 上的方法类,继承自 ActiveRecord::Base
  • last calls find 类方法。
  • find 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 获得的任何记录不会是新纪录。

    希望这可以帮助您理解。

    关于ruby-on-rails - activerecord 如何知道执行插入或更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683745/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com