【发布时间】:2020-05-05 21:23:03
【问题描述】:
我有一个模型(配对),它具有长度和日期属性(以及其他属性)。我正在尝试查询所有不涉及特定日期或日期范围的配对,同时匹配配对的其他属性。所有其他查询的代码都可以正常工作,但我的 where.not 排除了所有记录。这是因为(我认为)我构建关系/查询的方式。
我需要排除所选日期范围并匹配长度的内容。这需要叠加在其他范围内的查询上。
关于如何实现这一点的任何想法?
提前致谢!
控制器代码:
rel = rel.other scoped queries
@all_trip_len.each do |len|
rel = rel.date_selector(@date_sel_1, @date_start_1, @date_end_1, len)
end
rel = rel.more scoped queries
模型范围:
def self.date_selector(sel, start_d, end_d, length)
# Need to get all possible start dates that could touch avoid days for each length of trip
rel = self
start = Date.parse(start_d) - (length.to_i - 1)
rel = rel.where.not(date: start.to_s..Date.parse(end_d).to_s).where(length: length)
return rel
end
我收到的查询是:
SELECT "pairings".*
FROM "pairings"
WHERE "pairings"."bid_month_id" = $1
AND NOT ("pairings"."date" BETWEEN $2 AND $3)
AND "pairings"."length" = $4
AND NOT ("pairings"."date" BETWEEN $5 AND $6)
AND "pairings"."length" = $7 [["bid_month_id", 8], ["date", "2020-04-08"], ["date", "2020-04-08"], ["length", 1], ["date", "2020-04-07"], ["date", "2020-04-08"], ["length", 2]
我需要更多类似的东西:
SELECT "pairings".*
FROM "pairings"
WHERE "pairings"."bid_month_id" = $1
AND NOT (("pairings"."date" BETWEEN $2 AND $3)
AND "pairings"."length" = $4)
AND NOT (("pairings"."date" BETWEEN $5 AND $6)
AND "pairings"."length" = $7) [["bid_month_id", 8], ["date", "2020-04-08"], ["date", "2020-04-08"], ["length", 1], ["date", "2020-04-07"], ["date", "2020-04-08"], ["length", 2]
编辑:
在 MurifoX 的帮助下,我走得更远了。查询的构建几乎正确,但我需要在 pairing.date 分组之间进行 OR。
我现在拥有的:
SELECT "pairings".*
FROM "pairings"
WHERE "pairings"."bid_month_id" = $3
AND (((date <= '2020-04-06' AND date >= '2020-04-07') AND length = 1))
AND (((date <= '2020-04-05' AND date >= '2020-04-07') AND length = 2))
我需要什么:
SELECT "pairings".*
FROM "pairings"
WHERE "pairings"."bid_month_id" = $3
AND (((date <= '2020-04-06' AND date >= '2020-04-07') AND length = 1)
OR ((date <= '2020-04-05' AND date >= '2020-04-07') AND length = 2))
我尝试过使用 rails 5 或 (rel.or(Pairing.date_selector(xxx)) 但这不起作用,因为它会将所有 where AND 转换为 OR,而我只需要配对/日期分组之间的 OR。还需要日期分组周围的括号。
【问题讨论】:
标签: ruby-on-rails activerecord