Arel: Как написать attr = NULL на языке arel?

У меня проблема с arel: я хочу заставить что-то вроде «attr = NULL», используя Arel. Arel позволяет мне сделать что-то вроде этого:

table = obj.arel_table # obj has attr
table[:attr].eq(nil) # returns ''objs'.'attr' IS NULL'

это справедливо, так как в запросах это правильно. Но при обновлениях я хочу иметь возможность установить что-то в NULL и, желательно, без необходимости писать SQL самостоятельно (update_all из AR не поддерживает ARel-подобную функциональность для коллекций: objs.things.update_all(:created_at => nil ), это ломается). В основном я пытаюсь сделать этот блок кода внутри вызова update_all, повторяющегося для функций arel и to_sql. Возможно ли это?


person ChuckE    schedule 25.10.2012    source источник
comment
Вы уверены, что столбец created_at допускает нулевые значения? Как именно ваш пример ломается?   -  person sockmonk    schedule 15.06.2015


Ответы (1)


Единственный известный мне способ сделать что-то подобное - использовать SqlLiteral примерно так:

table[attr].eq(Arel::Nodes::SqlLiteral.new("NULL"))

это заставит arel пропустить процессор nil и сделать простое равенство

person Eduardo Sabino    schedule 15.03.2019
comment
Это дает = NULL, а не IS NULL. - person Jason Swett; 18.02.2020