我试图避免在保存模型时设置updated_at属性而不进行任何更改。在调试过程中,我注意到"changed"数组列出了一个我知道实际上没有在表单中更改的属性。但是,该属性有一个reader方法。该方法给出的结果与其当前状态不同。是否有一种方法可以在读取器方法中手动清除该属性上的"changed"标志?
葡萄酒.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%[品种名称]"。这显然干扰了"更改"标志。。。
我避免重写字段读取器,因为这使我无法直接访问存储在数据库中的值(即不必调用read_attribute)以用于其他逻辑。当你需要检查数据库中是否真的存储了一个值,或者遇到有值存储但格式也是"100%某个品种"的情况时,这会很麻烦,我认为如果你有一个表单字段,你会这样做。
我通常会添加这样的内容:
def blends_description
if blends.nil?
"100% #{ name.split(" ").map { |w| varietals.include?(w.downcase) ? w : nil }.compact.join(" ") }"
else
blends
end
end