2

ID が配列に含まれていないアクティブな関係をすべて取得したいと考えています。このような:

    @widgets = Widget.where("id not in (?)", [1, 2, 3])

これはうまくいきます。フィルター配列によって除外されたレコードを除く、完全な Widget テーブルを返します。ただし、フィルター配列が空の場合は機能しません。

    @widgets = Widget.where("id not in (?)", [])

Widget.all に相当するものが本当に必要な場合は、"[]" を返します。

フィルター配列が空かどうかを最初にテストし、クエリを変更することで、これを回避しました。しかし、回避策はkludge. フィルター配列が空の場合にテーブル全体を返すように、この「where」句を表現する方法はありますか?

4

2 に答える 2

2

Widget モデルにスコープを追加できます。

scope :excluding_ids, ->(ids) { where('id NOT IN (?)', ids) if ids.any? }

次に、必要な場所でこれを行うだけです。

@widgets = Widgets.excluding_ids([1,2,3])
于 2013-07-11T15:35:09.127 に答える
1

ID は 1 から始まると想定しているため、id=0 のウィジェットはありません。配列にゼロを追加すると、空になることはなく、id=0 のウィジェットがないため、すべてのウィジェットが返されます。

@widgets = Widget.where("id not in (?)", my_array + [0])

これは一種のハックですが、うまくいくはずです!

于 2013-07-11T15:23:04.677 に答える