2013-06-02 2 views
20

배열에 활성 레코드 개체 집합이 있습니다.배열에서 활성 레코드 개체를 제거하는 방법

난 그냥 데이터베이스

a = Model.limit(2) 

b = Model.first 

a.delete(b) 

반환 전무 값의 배열에서 객체를 삭제할

어쨌든

그 거기 삭제하지

? 귀하의 경우에는

objects_in_db = Model.all 
objects_in_array = Model.first(2) 
objects_in_array.delete_if { |obj| !objects_in_db.include?(obj)} 

Model.limit(2) 처음 두 개체를 반환하지 않을 수 있습니다 그래서 배열 ab이 포함되어 있지 않을 수도 있습니다 따라서, 그것은 nil를 반환

답변

23
a.to_a - [b] 

배경 : a.to_a convertrs 메모리의 배열 관계.
[b]은 단지 요소 만있는 배열이며, 메모리에서 삭제하려고합니다.
a.to_a - [b]은 배열 빼기를 수행합니다.

(. 레일 3.2 .to_a가 액세스 된 관계로 자동적으로 도포 I가 gregates 동의 : 명시 적 배열에 관계 변환 낫다)

1

이 당신이 필요합니다.

+0

내가 매칭 오브젝트를 볼 수는 B의 이익이고 – sangeethkumar

+0

모델의 구조를 제공 할 수 있습니까? 다른 모델을 시도해보고 모델에 문제가 있는지 확인하십시오. – itz2k13

13

ActiveRecordModel.limit(2)이 배열을 반환하지 않기 때문에 잠재적으로 혼란이있을 수 있습니다. 당신이 a.delete(b)를 호출 할 때

Model.limit(2).class #=> ActiveRecordRelation 

그래서, 당신은 Array#delete를 호출 할 수 없습니다.

대신 사용해 :

a = Model.limit(2).to_a # Executes the query and returns an array 
b = Model.first 
a.delete(b) 
+0

'all'을 사용하여 관계의 배열을 가져 오는 것이 좋습니다. 나는 노력했고'to_a'도 잘 작동하며 더 명확한 부분 일 수도 있습니다. – semiomant

+2

'all'은 Rails 4.2에서 더 이상 배열을 반환하지 않습니다.'to_a'는 않습니다. –

관련 문제