Buscando registros del mes actual con una consulta DataMapper
-
20-09-2019 - |
Pregunta
Estoy intentando reproducir esta consulta SQL que se utiliza con ActiveRecord:
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
Pero ya que estoy convirtiendo todo para DataMapper que estaba buscando una manera de hacer esto ...
¿Alguien puede ayudar?
Solución
supongo ya que este está etiquetado con "ruby-on-rails" que tiene ActiveSupport cargado. Esto proporcionará el método # end_of_month ayudante de tiempo. Con él se puede reescribir la consulta como:
time = Date.new(year, month).to_time
Post.all(:created_at => time..time.end_of_month)
Esto no sólo es más simple, elimina SQL prima a partir de la consulta (por lo que la consulta es más portátil a cosas que no sean RDBMS), y lo más importante es probable que realizar mucho mejor que la otra consulta. Con EXTRACT
la base de datos es probable que tenga que realizar un escaneo completo de tabla para extraer el año y el mes de created_at en cada fila , y luego compararlos con los valores esperados. Si usted tiene un gran conjunto de datos, esto podría ser una carga significativa en su base de datos. Sin embargo, siempre que su columna created_at está indexado, el enfoque anterior debe ser extremadamente eficiente en comparación.