在属性读取器方法上设置Rails activerecord脏标志

时间:2013-02-14 03:12:14

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord

我正在尝试避免让我的模型在保存时设置updated_at属性而不进行任何更改。通过调试过程,我注意到'changed'数组列出了一个我知道实际上没有从表单中更改过的属性。然而,该属性具有读者方法。该方法给出的结果与其当前状态不同。有没有办法在阅读器方法中手动清除该属性上的“已更改”标志?

Wine.rb

before_save :check_for_changes

def blends
    if read_attribute(:blends).nil?
    "100% #{ name.split(" ").map { |w| varietals.include?(w.downcase) ? w : nil }.compact.join(" ") }"
    else
    read_attribute(:blends)
    end
end

def check_for_changes
    return changed?
end

如果没有列出任何混合%,基本上'混合'方法会发出“100%[品种名称]”。这显然会干扰“改变”的旗帜......

1 个答案:

答案 0 :(得分:0)

我避免重写字段读取器,因为这使我无法直接访问存储在数据库中的值(即无需调用read_attribute)以获取其他逻辑。当您需要检查数据库中是否存在实际存储的值或遇到存储值的情况但是它的格式为“100%some-varietal”时,这很麻烦,因为我认为如果你有这是一个表格领域。

我通常会添加类似的内容:

def blends_description
  if blends.nil?
    "100% #{ name.split(" ").map { |w| varietals.include?(w.downcase) ? w : nil }.compact.join(" ") }"
  else
    blends
  end
end