[英]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 }
關於一種更聰明的方法,它取決於floor
和max_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.