Как обойтись без delete_if для Active Record? - PullRequest
0 голосов
/ 07 мая 2018

Когда я делаю:

apartments = Apartment.where(apart_params).delete_if{|x| x.floor == x.max_floor }

Метод массива Ruby delete_if для активной записи. Отношение объекта приводит к

NoMethodError (undefined method `delete_if' for #<Apartment::ActiveRecord_Relation:0x00000006d84ea0>
Did you mean?  delete
               delete_all):

Я не понимаю, почему это происходит - кажется, что этот объект реагирует как обычный массив ...

Есть ли более разумная альтернатива, кроме использования обычного блока do?

Может быть, вы можете посоветовать сделать умный SQL (postgres) запрос, чтобы отклонить те квартиры, которые находятся на последнем этаже?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Даже если Apartment.where(apart_params) выглядит как объект Array, это не так! Как говорится в ошибке, он возвращает ActiveRecordRelation, который не является массивом. Итак, если вы хотите использовать методы массива в ActiveRecordRelation, вам нужно преобразовать ваш объект в массив с to_a

apartments = Apartment.where(apart_params).to_a.delete_if{|x| x.floor == x.max_floor }
0 голосов
/ 07 мая 2018

Я бы предложил переключить ваше apartments назначение на следующее:

apartments = Apartment.where(apart_params).map{|x| x.floor == x.max_floor ? x.delete : x }

0 голосов
/ 07 мая 2018

Отношение можно преобразовать в массив, а затем можно вызвать delete_if:

Apartment.where(apart_params).to_a.delete_if {|x| x.floor == x.max_floor }

О более разумном способе зависит, являются ли методы floor и max_floor столбцами. Если так, то:

Apartment.where(apart_params).where.not("floor = max_floor")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...