[ruby-on-rails] Как вернуть пустое отношение ActiveRecord?



Answers

Более портативное решение, для которого не требуется столбец «id», и не предполагает, что не будет строки с идентификатором 0:

scope :none, where("1 = 0")

Я все еще ищу более «правильный» способ.

Question

Если у меня есть область с лямбда и она принимает аргумент, в зависимости от значения аргумента, я мог бы знать, что совпадений не будет, но я все же хочу вернуть отношение, а не пустой массив:

scope :for_users, lambda { |users| users.any? ? where("user_id IN (?)", users.map(&:id).join(',')) : [] }

То, что я действительно хочу, - это метод «none», противоположный «все», который возвращает отношение, которое все еще может быть привязано, но приводит к короткому замыканию запроса.




Существуют также варианты, но все они делают запрос на db

where('false')
where('null')



Я думаю, что предпочитаю, чтобы это выглядело так:

scope :none, limit(0)

Приведя что-то вроде этого:

scope :users, lambda { |ids| ids.present? ? where("user_id IN (?)", ids) : limit(0) }



Прибытие в Rails 4

В Rails 4 цепочка ActiveRecord::NullRelation будет возвращена из таких вызовов, как Post.none .

Ни он, ни методы с цепочкой не будут генерировать запросы к базе данных.

Согласно комментариям:

Возвращенный объект ActiveRecord :: NullRelation наследует от Relation и реализует шаблон Null Object. Это объект с определенным нулевым поведением и всегда возвращает пустой массив записей без запроса базы данных.

См. Исходный код .




Related