0

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です。

何か不足していますか?

4

1 に答える 1

0

処理したいケースを考えると、数学が間違っていることに気づきました。

  • record_a の adisplayは 21になります
  • record_b の adisplayは 22になります

私がする必要があったのは、配列を次のように変更することでした:

{
  sphinx_select: with_display,
  with: {'display' =>  [12, 21, 22]},
} 

範囲内で終了するレコード (21)、範囲内で開始するレコード (12)、および範囲内で開始および終了するレコード (22) のケースを処理するため

于 2012-12-21T05:43:39.703 に答える