ThinkingSphinx を使用して、範囲内の開始日または同じ範囲内の終了日を持つレコード、基本的にこの範囲内で開始または終了するレコードを返そうとしています。
これを行うために、次のように、ドキュメントに従って計算された属性と sphinx_select を、この投稿が日付範囲に対して提案するものと組み合わせて使用しています (2 つのレコードがあり、record_a は範囲外で始まり、record_b は範囲内で終わると仮定します)範囲内で終了します):
with_display = "*, IF(start_at >= #{range_start.to_i}, 1, 0) + " +
"IF(start_at <= #{range_end.to_i}, 1, 0) + " +
"IF(end_at >= #{range_start.to_i}, 10, 0) + " +
"IF(end_at <= #{range_end.to_i}, 10, 0) AS display"
{
sphinx_select: with_display,
with: {'display' => [2, 20, 22]},
}
=> [record_b]
ただし、start_at 条件のみを使用すると 1 つのレコードが取得され、end_at 条件のみを使用すると両方のレコードが返されます。
with_display = "*, IF(start_at >= #{range_start.to_i}, 1, 0) + " +
"IF(start_at <= #{range_end.to_i}, 1, 0) AS display"
=> [record_b]
with_display = "*, IF(end_at >= #{range_start.to_i}, 10, 0) + " +
"IF(end_at <= #{range_end.to_i}, 10, 0) AS display"
=> [record_a, record_b]
これを正しく理解していれば、4 つの条件すべてを満たしていれば、record_a と record_b の両方が返されるdisplay
はずdisplay
です。
何か不足していますか?