如何在Rails中获得重复的月份和年份匹配记录?

时间:2018-12-18 09:44:55

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-5

我想从表中获取记录的重复月份 我在start_date列内有叶子表,有很多记录我的数据库 https://imgur.com/a/jdyxTo1 示例我在表中有3条重复记录 返回重复记录#08.01.2019,31.01.2019,25.01.2019 该怎么做?

class LeaveController < ApplicationController
  def new
    #your code here 
  end
end
  • 我的模型名称离开我的表名称叶子

2 个答案:

答案 0 :(得分:0)

当您尝试在单个数组中查找所有月份时,无法按月份查找重复的日期 下面可以为您提供一系列对象,其中您的月份号和该月份号的重复日期将在那里

对于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

答案 1 :(得分:0)

在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           | ...

没有与他人共享月份的叶子将没有条目。