Каждый ответ на этой странице неправильный, потому что ни один из этих ответов не учитывает ВСЕ случаи массива, Особенно массивы, которые имеют только один элемент .
Вот пример, который будет FAIL с использованием любого из так называемых решений на этой странице:
@ids = [1]
Post.where("publisher_id NOT IN (?)", @ids)
#ERROR
Post.where("publisher_id NOT IN (?)", [4])
#ERROR
#...etc
#ALSO
@ids = []
Post.where("publisher_id NOT IN (?)", @ids)
#ERROR
Post.where("publisher_id NOT IN (?)", [])
#ERROR
#...etc
#The problem here is that when the array only has one item, only that element is
#returned, NOT an array, like we had specified
#Part of the sql that is generated looks like:
#...WHERE (publisher_id NOT IN 166)
#It should be:
#...WHERE (publisher_id NOT IN (166))
Единственный ответ на этой странице, который действительно находится на правильном пути и занимается этим очень важным делом,@ Тудор Константина.Но проблема в том, что он на самом деле не показал «способ» использования своей методологии для решения реального абстрактного примера вопроса, который опубликовал ОП (а не только с использованием жестко закодированных чисел).
вот мое решениединамически находить идентификаторы, не входящие в ассоциацию Activerecord, с учетом массива идентификаторов, которые нужно исключить, которые будут работать с массивом из n элементов (... включая n = 1 и n = 0)
@ids = [166]
@attribute = "publisher_id"
@predicate = "NOT IN"
@ids = "(" + @ids.join(",") + ")"
if @ids == "()"
#Empty array, just set @ids, @attribute, and @predicate to nil
@ids = @attribute = @predicate = nil
end
#Finally, make the query
Post.where( [@attribute, @predicate, @ids].join(" ") )
#Part of the sql that is generated looks like:
#...WHERE (publisher_id NOT IN (166))
#CORRECT!
#If we had set @ids = [] (empty array)
#Then the if statement sets everything to nil, and then
#rails removes the blank " " space in the where clause automatically and does
#the query as if all records should be returned, which
#logically makes sense!
Если этов любом случае, пожалуйста, до голосования!Если вы не уверены или не поняли один из моих комментариев, пожалуйста, дайте мне знать.