Railsの:日付によってスコープの検証し独自性
-
19-09-2019 - |
質問
私は、ユーザーごとに一日一回あたりのモデルのセーブ/更新を可能にしなければならないRailsのモデルを持っています。私は、エラーを追加し、ユーザー、日付ごとに検索を行うためのコールバックを持っているが、これは醜いですし、非レールのような感じ。 (私はそれを維持する必要がある/及び時間部分が重要である)私は、典型的なのcreated_at / updated_atの列を持っています。
だから、私はどちらかでし把握ます:
1)ことによって作成と適用範囲の日付だけで、別のモデルの属性(bleh)を作成します。
2)を使用してください:スコープは、例えば、属性何とかのcreated_atのちょうど日付部分を取得validates_uniqueness_of:ユーザー:範囲=>:created_at.to_date(明らかに、動作しない)
3)検証しない限り=> Proc.new {| O |私の既存のコールバックに一致するファインダー}(グロス)
http://ar.rubyonrails.org/classes/ActiveRecord /Validations/ClassMethods.html#M000086する
があり、これらの圧倒的な数であるが、私はそれは、SQLの代わりに、ルビー(明白なスケーラビリティの理由から)で行われることはなく、思いません。
任意の考え?より良い方法はありますか?
解決
また、あなた自身を検証する方法を書くことができます。これは非常に簡単のです。そして、カスタムvalidateメソッドでは、 date_truncする (PostgreSQLは)必要な時間のスパンで既存のレコードを検索するために使用することができます。 date_truncも(e.g.hour、日、週、月)パラメータ化することができます。
の代わりにdate_trunc簡単な条件が矛盾するレコードを検索するために使用することができます。例えば [ "USER_ID =?AND updated_atの> =?"、self.user_id、Time.now.beginning_of_day]そして、私はそれがインデックスを使用することができますので、このレコードのルックアップが速くなる必要がありますね。
他のヒント
私は conditions
するを使用して終了しましたvalidates_uniqueness_of
それに今日のためだけのものにチェックしたレコードを制限ラムダを渡すとオプションます。
class AttendanceRecord < ActiveRecord::Base
validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end