查询连接表上具有多个条件和记录的记录

时间:2016-11-04 02:04:17

标签: ruby-on-rails

在具有人员表和可用性表的rails应用程序中:

Person.rb

has_many :availabilities

Availability.rb

belongs_to :person

人员栏目在这里无关紧要。可用性有三个用于查找可用人员的详细列:

day: integer #0-6 0 is sunday
start_time: time
end_time: time

实际上,有一个搜索引擎能够执行这样的查询:

people = people.joins("INNER JOIN availabilities ON availabilities.person_id = people.id")
people = people.where("availabilities.day = ?", params[:day])

.... 

因此,举例来说,我们可以在星期日早上8点到11点搜索一些人。

我想实施一个多天的搜索。搜索引擎将显示一个多选字段并返回一个我们可以使用的整数数组:

params[:day] = ["1","2","3"]

一个典型的问题是:谁是周一,周五和周日从早上8点到下午12点有空的人。我们期待一份包含所有这三天可用性的人员名单,

我的问题是如何构建查询?是否有活动的记录方式或我应该使用纯SQL吗? Postgres数据库。

我无法将INHAVING/COUNT一起使用,因为一个人可以在同一天拥有多个可用性。

我的第一个客人是尝试一个通用的联合/交叉查询构建器,但也许我错过了一些更容易的东西。

我已经搜索过,但也许我错过了什么,欢迎任何信息!

ps:如果你对我的问题的标题有更好的了解,我很难找到一个。

1 个答案:

答案 0 :(得分:0)

您已经在使用SQL片段:

people = people.where("availabilities.day = ?", params[:day])

您正在寻找的是SQL IN运算符,然后您可以传入一个数组:

people = people.where("availabilities.day IN ?", params[:day])

我将所有这些内容放在可用性.includes的范围内进行加入:

def self.find_people(days)
  # attach a list of people to each day
  includes(:people).where("day IN ?", days)
end