Frage

Ich habe eine Rails-Modell, das sollte nur einmal pro Benutzer pro Tag Speichern / Aktualisieren eines Modells ermöglichen. Ich habe einen Rückruf, um die Suche durch den Benutzer und das Datum zu tun dann auf Fehler hinzufügen, aber das ist hässlich und fühlt sich un-Schienen-like. Ich habe die typischen created_at / updated_at Spalten (und der Zeitteil ist signifikant / Ich brauche es zu halten).

So Ich denke, ich könnte entweder:

1) Erstellen Sie ein anderes Modell Attribut, das nur das Datum der Schöpfung und den Umfang von dieser (bleh)

2) Verwenden Sie das: Attribut Umfang aber irgendwie nur das Datum Teil created_at erhalten, z.B. validates_uniqueness_of: Benutzer,: scope =>: created_at.to_date (funktioniert nicht, natürlich)

3) Validate es sei denn, => Proc.new {| o | Finder, die meine vorhandenen Callback-Spiele} (brutto)

http://ar.rubyonrails.org/classes/ActiveRecord /Validations/ClassMethods.html#M000086

Es wird nicht eine überwältigende Anzahl von ihnen, aber ich möchte lieber, dass es in SQL anstelle von Ruby (aus offensichtlichen Gründen der Skalierbarkeit) durchgeführt wird.

Alle Gedanken? Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Sie können auch Ihre eigene validates Methode schreiben. Das ist ganz einfach . Und in der benutzerdefinierten Validate-Methode, DATE_TRUNC (Postgresql) verwendet werden vorhandene Datensätze in erforderliche Zeitspanne zu finden. DATE_TRUNC kann auch (e.g.hour, Tag, Woche, Monat) parametrisiert werden.

Statt DATE_TRUNC eine einfache Bedingung kann verwendet werden, widersprüchliche Datensatz zu finden. z.B. [ "User_id = AND updated_at> =?", Self.user_id, Time.now.beginning_of_day] Und ich denke, das ist Rekord schneller aussehen sollte, weil es einen Index verwenden kann.

Andere Tipps

Ich landete mit dem conditions Option mit validates_uniqueness_of und weitergeben Lambda, die die Datensätze überprüft, um nur diejenigen, für heute begrenzt.

class AttendanceRecord < ActiveRecord::Base
  validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top