2012-03-09 27 views
5

Sử dụng Mongoid, có thể sử dụng "update_all" để đẩy giá trị vào trường mảng cho tất cả các mục nhập khớp với một tiêu chí nhất định không?Với Mongoid, tôi có thể "update_all" để đẩy giá trị lên trường mảng cho nhiều mục cùng một lúc không?

Ví dụ:

class Foo 
    field :username 
    field :bar, :type => Array 

    def update_all_bars 
    array_of_names = ['foo','bar','baz'] 
    Foo.any_in(username: foo).each do |f| 
     f.push(:bar,'my_new_val') 
    end 
    end 
end 

Tôi tự hỏi nếu có một cách để cập nhật tất cả những người sử dụng cùng một lúc (để đẩy giá trị 'my_new_val' vào trường "foo" cho mỗi mục phù hợp) sử dụng "update_all "(hoặc một cái gì đó tương tự) thay vì lặp qua chúng để cập nhật từng cái một. Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến và cho đến nay không có may mắn.

Cảm ơn

Trả lời

5

Bạn cần gọi từ trình điều khiển Mongo DB. Bạn có thể làm:

Foo.collection.update( 
    Foo.any_in(username:foo).selector, 
    {'$push' => {bar: 'my_new_val'}}, 
    {:multi => true} 
) 

Hoặc

Foo.collection.update( 
    {'$in' => {username: foo}}, 
    {'$push' => {bar: 'my_new_val'}}, 
    {:multi => true} 
) 

Bạn có thể làm một pull_request hoặc một yêu cầu tính năng nếu bạn muốn điều đó trong Mongoid dựng sẵn.

+0

Chỉ cần viết câu trả lời, cũng phải có thông số thứ ba 'đa: true' – rubish

+0

bạn nói đúng. Tôi cập nhật câu trả lời của mình – shingara

+0

Brilliant! Cám ơn rất nhiều! – orderedchaos

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