2011-12-08 4 views
1

Mongodb (Mondoid 매퍼)가있는 레일에 간단한 응용 프로그램이 있습니다. Scaffold posts, 그리고 등급 기능을 구현하려고합니다. 당신이 볼 수 있듯이 두 개의 필드 voter_up, _down있다mongodb의 배열에서 객체 삭제

> class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :title, type: String 
    field :description, type: String 
    field :rank, type: Integer, default: "0" 
    field :voter_up, type: Array, default: [] 
    field :voter_down, type: Array, default: [] 

: Post 다음 구조를 가지고있다. 투표 방법에 따라 사용자를 추가하는 것입니다. self.voter_up << user.id 또는 self.voter_down << user.id 데이터베이스에서는 다음과 같이 보입니다.

"voter_up" : [ 
    ObjectId("4ee08b6e405f3d0a29000005"), 
    ObjectId("4ee0aaff405f3d0a2900003a") 
] 

그리고 사용자가 마음을 바꾸어 반대로 투표를 원할 경우. 예를 들어 처음으로 사용자가 투표를 UP했습니다. 그리고 DOWN으로 투표했습니다. 이 상황에서 배열 voter_up에서이 사용자를 삭제하고 voter_down에 추가해야합니다. 레일 콘솔에서 그것은 array.delete(object)을 작동하지만 모델 기능에서 self.voter_up.delete(user.id)을 시도하면 아무 일도 일어나지 않습니다. 왜?

답변

2

콘솔과 모달 모두 작동 할까봐 걱정됩니다. 여기 당신이 사용하는 삭제는 mongoid가 아닌 루비 배열 방법이기 때문입니다. 따라서 변경된 배열을 서버로 푸시하려면 삭제 후 저장을 호출해야합니다.

 self.voter_up.delete(user.id) 
    self.save 
+0

오 시도가,이 작동합니다 생각 고맙습니다! 나는 그것을 잊었다 =) – Eugene

0

self.voter_up < < "# {user.id}", 또는 self.voter_down < < "# {user.id}" 는 I는이