Rails 3检查属性是否改变
在Rails 3更新之前,需要检查一个属性块是否已经改变。
街道1,街道2,城市,州,邮政编码
我知道我可以使用类似的东西
if @user.street1 != params[:user][:street1] then do something.... end
但是这段代码将是非常长的。 有更清洁的方法吗?
查看ActiveModel :: Dirty (默认情况下在所有模型上都可用)。 文档非常好,但它可以让你做的事情,如:
@user.street1_changed? # => true/false
这就是我解决检查多个属性变化的问题。
attrs = ["street1", "street2", "city", "state", "zipcode"] if (@user.changed & attrs).any? then do something.... end
已changed
方法返回为该对象更改的属性的数组。
@user.changed
和attrs
都是数组,所以我可以得到交集(参见ary & other ary
方法)。 交集的结果是一个数组。 通过调用any?
在数组上,如果至less存在一个交点,则为真。
changed_attributes
方法也是非常有用的,它返回属性的散列值和原始值,并且这些changes
返回属性与它们的原始值和新值(在数组中)的哈希值。
您可以检查支持这些方法的版本的APIDock。
ActiveModel::Dirty
对我不起作用,因为@model.update_attributes()
隐藏了更改。 所以这就是我如何检测控制器update
方法中的更改:
def update @model = Model.find(params[:id]) detect_changes if @model.update_attributes(params[:model]) do_stuff if attr_changed? end end private def detect_changes @changed = [] @changed << :attr if @model.attr != params[:model][:attr] end def attr_changed? @changed.include :attr end
如果你试图检测到很多属性的变化,它可能会变得混乱。 可能不应该在控制器中这样做,但是呃。