我不是100%確定爲什麼ActiveModel::Dirty
有它的名字。我猜是因爲它是認爲是髒才能使用它。ActiveModel ::髒手錶只有特定領域
但是在某些情況下,不可能避免在特定領域觀看。
例:
if self.name_changed?
self.slug = self.name.parameterize
end
沒有ActiveModel::Dirty
,代碼將如下所示:
if old_name != self.name
self.slug = self.name.parameterize
end
這意味着具有前存儲old_name
,並且它不可讀的,所以IMHO,它是髒比使用ActiveModel::Dirty
。它變得更糟,如果old_number
是一個數字,並且等於params[:user]['old_number']
,因爲它需要正確格式化(解析爲int),而ActiveRecord自動執行此操作。
所以我會覺得乾淨定義在模型級有看頭領域:
class User < ActiveRecord::Base
include ActiveModel::Dirty
watchable_fields :name
before_save :generate_slug, if: name_changed?
def generate_slug
self.slug = self.name.parameterize
end
end
或(?甚至更好)在控制器級別,之前分配新值:
def update
@user = current_user
@user.watch_fields(:name)
@user.assign_attributes(params[:user])
@user.generate_slug if @user.name_changed?
@user.save # etc.
end
好東西在這裏它可以消除使用ActiveModel::Dirty
產生的內存過載。
所以我的問題是:
我能做到這一點使用ActiveRecord預建的工具,或者我應該寫一個自定義庫這樣做呢?
感謝
有趣。雖然它仍然會產生內存過載,不是嗎?我的意思是,跟蹤某些領域是有道理的,但其他領域則不是。 –
我確定有一些開銷,但它可能不相關,除非你有非常非常嚴格的內存要求。 – Sharagoz