在具有人员表和可用性表的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数据库。
我无法将IN
与HAVING/COUNT
一起使用,因为一个人可以在同一天拥有多个可用性。
我的第一个客人是尝试一个通用的联合/交叉查询构建器,但也许我错过了一些更容易的东西。
我已经搜索过,但也许我错过了什么,欢迎任何信息!
ps:如果你对我的问题的标题有更好的了解,我很难找到一个。答案 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