Estoy implementando una funcionalidad para rastrear qué artículos ha leído un usuario.
create_table "article", :force => true do |t|
t.string "title"
t.text "content"
end
Esta es mi migración hasta ahora:
create_table :user_views do |t|
t.integer :user_id
t.integer :article_id
end
Siempre se consultará la tabla user_views para buscar ambas columnas, nunca solo una. Mi pregunta es cómo debería verse mi índice. ¿Hay alguna diferencia en el orden de estas tablas, debería haber más opciones o lo que sea? Mi base de datos de destino es Postgres.
add_index(:user_views, [:article_id, :user_id])
Gracias.
ACTUALIZACIÓN:
Debido a que solo puede existir una fila que contenga los mismos valores en ambas columnas (ya que al saber si user_id HA leído article_id), ¿debería considerar la opción: única? Si no me equivoco, eso significa que no tengo que hacer ninguna verificación por mi cuenta y simplemente hacer una inserción cada vez que un usuario visita un artículo.
fuente
Respuestas:
El orden sí importa en la indexación.
[:user_id, :article_id]
, puede realizar una consulta rápida enuser_id
ouser_id AND article_id
, pero NO enarticle_id
.Su
add_index
línea de migración debería verse así:Pregunta sobre la opción 'única'
Una manera fácil de hacer esto en Rails es usarlo
validates
en su modelo con el alcance de launiqueness
siguiente manera ( documentación ):fuente
validates_uniqueness_of
(y su primovalidates uniqueness:
) son propensos a las condiciones de carreraSolo una advertencia sobre la verificación de la unicidad en el momento de la validación frente al índice: la base de datos realiza esta última, mientras que el modelo realiza la cartilla. Dado que puede haber varias instancias simultáneas de un modelo ejecutándose al mismo tiempo, la validación está sujeta a las condiciones de la carrera, lo que significa que puede no detectar duplicados en algunos casos (por ejemplo, enviar dos veces el mismo formulario al mismo tiempo).
fuente