Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do without delete_if for Active Record?

When I do:

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

Ruby's array method delete_if on Active record Relation object results in

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

I don't understand why it happens - this object seems to respond like a plain array...

Is there any smarter alternative except using plain each do block?

Maybe you can give an advise on making smart SQL (postgres) query to reject those apartments which are on the last floor?

like image 974
Alexander Gorg Avatar asked Dec 20 '25 17:12

Alexander Gorg


2 Answers

The relation can be converted to an array and then delete_if can be called:

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

About a smarter way, it depends if the floor and max_floor methods are columns. If so, then:

Apartment.where(apart_params).where.not("floor = max_floor")
like image 109
Igor Drozdov Avatar answered Dec 23 '25 08:12

Igor Drozdov


I would suggest switching your apartments assignment to the following:

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

like image 43
Velusamy Venkatraman Avatar answered Dec 23 '25 08:12

Velusamy Venkatraman