也许一些红宝石专家可以看出,在调用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
>上一个calls的find
类方法.
>找到calls find_last
> find_last @L_502_11@ find_initial
> find_initial calls find_every
> find_every calls find_by_sql
>和find_by_sql
电话instantiate
你会在这里看到,这个变化没有地方是@new_record设置,因此通过find获得的任何记录都不会是新的记录.
希望这有助于您理解.