Pregunta

Tengo un Rieles modelo que sólo debe permitir guardar/actualización de un modelo una vez por día y por usuario.Tengo una devolución de llamada para hacer la búsqueda por el usuario y la fecha, a continuación, agregue a los errores, pero esto es feo y se siente de la onu-rieles-como.Tengo el típico created_at / updated_at columnas (y la porción de tiempo es significativo/necesito mantenerla).

Así que me imagino que bien podría:

1) Crear otro modelo atributo que es sólo la fecha de creación y el alcance por que (bleh)

2) Utilizar el :atributo scope pero de alguna manera obtener sólo la parte de la fecha de created_at, por ejemplo,validates_uniqueness_of :usuario :alcance => :created_at.to_date (no funciona, obviamente)

3) Validar menos => Proc.nuevo{ |o| Buscador que coincide con mi existentes de devolución de llamada } (bruto)

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

No habrá un número abrumador de estos, pero yo prefiero que se haga en SQL en lugar de Ruby (por obvios motivos de escalabilidad).

Los pensamientos?Hay una manera mejor?

¿Fue útil?

Solución

También puede escribir su propio método valida. Esto es bastante fácil . Y en el método de validación personalizada, date_trunc (PostgreSQL) se puede utilizar para encontrar los registros existentes en lapso de tiempo requerido. date_trunc también puede ser parametrizada (e.g.hour, día, semana, mes).

En lugar de date_trunc una condición simple se puede utilizar para encontrar el registro en conflicto. p.ej. [ "User_id =? Y updated_at> =?", Self.user_id, Time.now.beginning_of_day] Y creo que este disco mirar hacia arriba debe ser más rápido, ya que puede utilizar un índice.

Otros consejos

Terminé usando el conditions opción con validates_uniqueness_of y pasándolo lambda que limita los registros seleccionados para solo los de hoy.

class AttendanceRecord < ActiveRecord::Base
  validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top