Оператор ИЛИ внутри запроса «Где активная запись» - PullRequest
1 голос
/ 18 марта 2019

Таким образом, внутри запроса Where Active Record (AR) вы можете выполнить:

game_stickers.where('stickers.name != ?', 'Ban')

Но как вы можете проверить совпадения с несколькими строками с помощью оператора OR без , выполнив что-то вроде:

game_stickers.where('stickers.name != ? OR stickers.name != ?', 'Ban', 'Closed')

или без возврата к чему-то вроде [см. Примечание ниже]:

game_stickers.where.not(stickers.name: ['Ban','Closed','Block'])

ПРИМЕЧАНИЕ:

Причина, по которой я не хочуперейти к последней альтернативе, потому что я использую некоторые joins и references в своих запросах, которые (насколько я вижу) не очень хорошо подходят для этой опции.Код контекста выглядит примерно так:

game_stickers_and_stickers = game_stickers.includes(:sticker)
game_stickers_and_stickers.where('stickers.name = ?', 'Ban').references(:stickers).where(placement_side: side)    

Возможно, вы можете посоветовать оптимальный способ выполнения этого запроса.

1 Ответ

1 голос
/ 18 марта 2019

Примечание: мне кажется, вы хотите И между этими условиями, а не ИЛИ. Думаю об этом. В любом случае, попробуйте этот

game_stickers_and_stickers = game_stickers.includes(:sticker)
game_stickers_and_stickers.where.not(stickers: {name: ['Ban','Closed','Block']}).where(placement_side: side) 

этот фрагмент условия должен быть преобразован в SQL

WHERE stickers.name NOT IN ('Ban', 'Closed', 'Block')
...