2017-12-09 7 views
1

私はテーブルにブール型の列を持ち、それに関連するdatetimeを持っています。ブール値が最初に真になったときに、私は追跡できるようにしたい。モデルでは、私はブール値が最初に真であるときを追跡する方法はありますか?

def example 
    if boolean_field == true 
    datetime_field = time.now 
    end 
end 

を試してみましたが、それに伴う問題は、ブール値がtrueに設定されている場合で、ブール値は常に一定の状態になりますので、私はページまたはデータベースをリロードするたびに更新し続けるでしょうdatetime_field本当。私はまたして、その上に汚れたレールを使用しようとしている:

boolean_field_changed? 

が、その方法は全くのdatetime列を更新するようではありません。P.S私はメソッドのbefore_saveコールバックを持っています。

def returned_time 
    if self.returned? 
     returned_at = Time.now 
    end 
end 


before_save :returned_time 

はfalseからtrueにboolean_fieldの変更がはるかに高く評価されたら、私は最初の時間を節約することができる方法上の任意の助け。ありがとうございます。

+0

このプロセスは、Railsの新しいバージョンで変更されました。どのバージョンのRailsを使用していますか? –

+0

@TomAranda遅く返事して申し訳ありませんが、現在私はレールを使っています5 – LordLJ

+0

'boolean_field_changed?' _before_ saveで呼び出されていれば、 'datetime_field'が更新されるのを防ぐことができますブール値フィールドが変更されたことを示します。 – inveterateliterate

答えて

0

returnedがテーブルのブール型列の場合、ActiveModel::Dirtyは不要です。このモジュールは、非データベース属性の変更検出を追加するためのモジュールです。 returnedがtrueの場合、そのフィールドが変更された場合、これはreturned_at時間を更新します

class MyModel < Application Record 

    before_save :returned_time 

    def returned_time 
    if self.returned? and self.returned_changed? 
     self.returned_at = Time.now 
    end 
    end 

end 

:あなたは、組み込みのchanged?方法のActive Recordのを使用することができるはずです。これはあなたのビジネスロジックに合っているかもしれません。これは日付のみを更新します

def returned_time 
    if self.returned? and self.returned_at.blank? 
    self.returned_at = Time.now 
    end 
end 

:あなたの目標だけにある場合

しかし、本が返却されたとき、あなたは代わりにreturned_at日付の有無を確認することをお勧めしますreturned_atフィールドを更新本が返され、返品日がない場合。

最後に、の前にreturned_atself.returned_at = Time.nowが重要です。そうしないと、フィールドが更新されないことがあります。

+0

ありがとうございます。それは確かにそれを修正した。それを感謝します。 @TomAranda – LordLJ

+0

私は試しましたが、残念なことに、私は評判15を下回っているので、私はそれを投票させません:/。私が上になると、私はそれに投票します:) – LordLJ

+0

私の間違い私はメッセージを誤解しています。投票は記録されますが、評判が15を下回っているため公に表示されません。助けてくれてありがとう – LordLJ

関連する問題