簡體   English   中英

沒有delete_if的Active Record怎么辦?

[英]How to do without delete_if for Active Record?

當我做:

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

Ruby的Active Record Relation對象上的數組方法delete_if導致

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

我不明白為什么會發生-這個對象似乎像一個普通的數組一樣響應...

除了使用普通的每個do塊之外,還有其他更聰明的選擇嗎?

也許您可以建議使用智能SQL(postgres)查詢來拒絕位於最后一層的公寓?

該關系可以轉換為數組,然后可以調用delete_if

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

關於一種更聰明的方法,它取決於floormax_floor方法是否為列。 如果是這樣,則:

Apartment.where(apart_params).where.not("floor = max_floor")

我建議將您的apartments分配更改為以下內容:

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

即使Apartment.where(apart_params)看起來像Array對象,也不是! 如錯誤所述,它返回一個ActiveRecordRelation,而不是一個Array。 因此,如果要在ActiveRecordRelation上使用數組方法,則必須使用to_a將對象轉換為數組

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM