2014-11-24 10 views
2

У меня проблема с попыткой работать с запросом NOT IN (с использованием Rails 4/Postgres, для справки) элегантным способом. Я пытаюсь получить список всех объектов определенной модели, которые не отображаются в таблице соединений для определенного экземпляра. Он работает, когда вы пытаетесь выполнить запрос NOT IN с пустым массивом, он выдает ошибку, потому что вы не можете искать NOT IN NULL..where.not с пустым массивом

Код ниже работает, но есть ли лучший способ, чем использовать непреднамеренное условие для создания псевдо-нулевого объекта?

def characters_selected 
    self.characters_tagged.pluck(:name) 
end 

def remaining_characters 
    characters = self.characters_selected 
    characters = ["SQL breaks if this is null"] if characters.empty? 

    # this query breaks on characters_selected == [] without the above line 
    Character.where("name NOT IN (?)", characters) 
end 

ответ

1

Это ActiveRecord способ:

def remaining_characters 
    characters = self.characters_selected 
    Character.where.not(:name => characters) 
end 

Когда characters.empty? предложение where становится «WHERE (1 = 1)».

Смежные вопросы