2013-06-02 21 views

Trả lời

23
a.to_a - [b] 

Bối cảnh: a.to_a convertrs mối quan hệ thành một mảng trong trong bộ nhớ.
[b] là một mảng chỉ bằng phần tử, bạn muốn xóa (trong bộ nhớ).
a.to_a - [b] thực hiện một bản chất mảng.

(. Trong Rails 3.2 .to_a được áp dụng tự động đến một mối quan hệ khi nó được truy cập Tôi đồng ý với gregates: Đó là tốt hơn để chuyển đổi các mối quan hệ với một mảng rõ ràng)

1

Đây là những gì bạn cần:

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

Trong trường hợp của bạn, Model.limit(2) có thể không trả lại đối tượng đầu tiên hai và do đó mảng a có thể không chứa b và do đó, nó sẽ trả nil.

+0

tôi có thể thấy đối tượng phù hợp là vô ích trong b – sangeethkumar

+0

bạn có thể cung cấp cấu trúc cho mô hình của mình không ?. Hãy thử với một số mô hình khác và xem có vấn đề gì với mô hình của bạn không. – itz2k13

13

Có thể có một số nhầm lẫn ở đây vì trong ActiveRecord, Model.limit(2) không trả lại mảng.

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

Vì vậy, khi bạn gọi a.delete(b), bạn có thể không được gọi Array#delete.

Hãy thử điều này thay vì:

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

ý tưởng hay để sử dụng 'all' để có được một mảng trong mối quan hệ. Tôi đã thử và 'to_a' hoạt động tốt và có thể rõ ràng hơn một chút. – semiomant

+2

'all' không trả về mảng nữa trong Rails 4.2,' to_a'. –

Các vấn đề liên quan