0

モデルを変更せずに保存するときに、モデルに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

基本的に、「blends」メソッドは、blend%がリストされていない場合、「100%[品種名]」を出力します。これは明らかに「変更された」フラグを妨害します。

4

1 に答える 1

0

他のロジックのためにデータベースに直接(つまり、read_attributeを呼び出さなくても)格納されている値にアクセスできないため、フィールドリーダーをオーバーライドすることは避けています。これは、データベースに実際に値が格納されているかどうかを確認する必要がある場合や、値が格納されているが、「100%some-variateal」の形式である場合に遭遇する場合は面倒です。このためのフォームフィールド。

私は通常、代わりに次のようなものを追加します。

def blends_description
  if blends.nil?
    "100% #{ name.split(" ").map { |w| varietals.include?(w.downcase) ? w : nil }.compact.join(" ") }"
  else
    blends
  end
end
于 2013-02-14T03:37:38.980 に答える