Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正在属性读取器方法上设置Rails activerecord脏标记_Ruby On Rails_Ruby_Ruby On Rails 3_Rails Activerecord - Fatal编程技术网

Ruby on rails 正在属性读取器方法上设置Rails activerecord脏标记

Ruby on rails 正在属性读取器方法上设置Rails activerecord脏标记,ruby-on-rails,ruby,ruby-on-rails-3,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Rails Activerecord,我试图避免在保存模型时,在不进行任何更改的情况下将其设置为updated_at属性。在调试过程中,我注意到“changed”数组列出了一个属性,我知道该属性在表单中没有实际更改。但是,该属性确实有一个reader方法。该方法给出的结果与其当前状态不同。在reader方法中是否有办法手动清除该属性上的“changed”标志 葡萄酒.rb before_save :check_for_changes def blends if read_attribute(:blends).nil?

我试图避免在保存模型时,在不进行任何更改的情况下将其设置为updated_at属性。在调试过程中,我注意到“changed”数组列出了一个属性,我知道该属性在表单中没有实际更改。但是,该属性确实有一个reader方法。该方法给出的结果与其当前状态不同。在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%[品种名称]”。这显然会干扰“changed”标志…

我避免重写字段读取器,因为这会阻止我直接访问存储在数据库中的值(即不必调用read_属性)以获取其他逻辑。当您需要检查数据库中是否实际存储了一个值,或者遇到存储了一个值但格式也是“100%某种变体”的情况时,这会很麻烦,我认为如果您有一个表单字段,您会遇到这种情况

我通常会添加如下内容:

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

延迟注释,但如果覆盖属性,则可以使用
self[attr]
self[attr]=