Как получить дубликат записи месяца и года в рельсах? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу получить повторяющийся месяц записи из таблицы. У меня есть таблица таблиц внутри столбца start_date, в которой есть много записей. Например, моя база данных db https://imgur.com/a/jdyxTo1. У меня 3 повторяющихся записи в таблице.2019,25.01.2019 Как это сделать?

class LeaveController < ApplicationController
  def new
    #your code here 
  end
end
  • Имя моей модели Оставить Имя моей таблицы Листья

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

На SQLite вы не можете.Поддерживаемые функции SQL действительно минимальны, вам лучше иметь локальный сервер postgres / mysql - тот же сервер и версию, которую вы будете использовать в рабочей среде.

В реальной базе данных SQL у вас есть функция EXTRACT(YEAR_MONTH from date), и вы можете использовать его с GROUP BY.

Это может быть правильный SQL, вы можете использовать его с простым Leave.connection.execute(...):

SELECT
  GROUP_CONCAT(`leaves`.`id` SEPARATOR ',') AS ids,
  GROUP_CONCAT(`leaves`.`start_date` SEPARATOR ',') AS start_dates
FROM `leaves`
GROUP BY EXTRACT(YEAR_MONTH from `leaves`.`start_date`)
HAVING COUNT(`leaves`.`id`) > 1

С данными в изображении,у вас будет следующий результат:

ids               | start_dates
------------------+---------------------------------
5,6,8             | 2019-01-08,2019-01-31,2019-01-25
1,2,3,4           | ...

и не будет записи для листьев, которые не делятся месяцами с другими.

0 голосов
/ 18 декабря 2018

Невозможно найти повторяющиеся даты по месяцам, когда вы пытаетесь найти все месяцы в одном массиве. Ниже приведен массив объектов, в котором будет указан номер вашего месяца и повторяющиеся даты для этого номера месяца

Для MySQL / PostgresQL

class LeaveController < ApplicationController
  def new
    @result = []
    12.times do |i|
      month_data = {
        month_number: i,
        duplicate_dates: Leave.where("extract(month from start_date) = ?", i).pluck(:start_date)
      }
      @result.push month_data
    end
    #Print and see the result
    p @result
  end
end

Обновление для SQLite

Поскольку вы используете sqlite, и приведенный выше синтаксис не поддерживается, есть способ для того же:

# In your model you can write a class method so you don't have to write all that
#   logic in your controller and make it reusable
class Leave < ActiveRecord::Base
  def self.duplicate_dates(current_month)
    query = "SELECT * FROM leaves WHERE strftime('%m', start_date) = #{current_month}"
    self.find_by_sql query
  end
end

class LeaveController < ApplicationController
  def new
    @result = []
    ('01'..'12').to_a.each do |i|
      # Get all the records with duplicate month
      duplicate_data = Leave.duplicate_dates(i)
      # The above will return a regular array and not an activerecord association,
      #   so pluck can't be used on it

      # To get only the dates you can use map 
      duplicate_dates = duplicate_data.map {|i| i.start_date}

      month_data = {
        month_number: i,
        duplicate_dates: duplicate_dates
      }
      @result.push month_data
    end
    #Print and see the result
    p @result
  end
end
...