質問

私は、ユーザーごとに一日一回あたりのモデルのセーブ/更新を可能にしなければならない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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top