2011-01-16 24 views
6

Używam Rails i mongoid do pracy z mongodb.Prosta aktualizacja danych boolowskich za pomocą mongdb?

Zwykle na szynach podczas pracy z Active: Record, masz dostęp do metody .toggle! co pozwala po prostu odwrócić wartość pola boolowskiego w bazie danych.

Niestety metoda ta nie jest dostępna dla MongoDB:

user = User.first 
user.toggle!(:admin) 
NoMethodError: undefined method `toggle!' for #<User:0x00000100eee700> 

Jest to niefortunne wystarczająco głupio ... i nie widzę w jaki sposób obejść bez jakiegoś skomplikowanego kodu ...

Wszelkie sugestia, jak osiągnąć ten sam wynik w zwięzły sposób?

Dzięki,

Alex

PS: też jednym z problemów jest to, że gdy chcę zmodyfikować pole, to przechodzi walidacji ponownie ... i to z prośbą o: hasło, które ja don „t zapisać w db, więc:

User.first.admin = !User.first.admin 

nawet nie będzie działać :(

Odpowiedz

6

Chodzi tu konkretnie mongoid nie MongoDB toggle! jest częścią 0., ale na szczęście nie jest trudno replikować.

def toggle!(field) 
    send "#{field}=", !self.send("#{field}?") 
    save :validation => false 
end 

Dodać, że do danego modelu (lub dodać go do modułu i umieścić go w modelu), a twoje Mongoid modele zyska równorzędnej funkcjonalności do czego jesteśmy przyzwyczajeni w AR. Odczytuje wartość pola, odwraca ją, zapisuje (poprzez program ustawiający, zgodnie z dokumentacją toggle!), a następnie zapisuje dokument, pomijając sprawdzanie poprawności.

+0

To jest naprawdę niesamowite! Dokładnie to, czego szukałem ... :) Nie znałem tej składni z wysyłką? Nie jestem pewien, co dokładnie robi? – Alex

+0

'send' wywołuje metodę do (" wysyła wiadomość do ") obiektu. '@ foo.bar (: baz)' jest takie samo jak '@ foo.send (" bar ",: baz)' - ponieważ określasz nazwę metody za pomocą send, możesz przekazywać zmienne i tym podobne. Jest to mocno wykorzystywane w metaprogramowaniu Ruby. –

+0

Dzięki za wyjaśnienie. Jednak po dokładnym testowaniu w rzeczywistości nie omija ona wszystkich walidacji. Mam validates_length_of: password,: minimum => 6,: maximum => 40, a użycie przełącznika spowoduje ode mnie błąd w długości hasła ... :(ale nie w potwierdzeniu obecności itp. Pominie to attr_accesible, itp. więc jest prawie doskonały poza sprawdzaniem długości – Alex

0

Ok walidacja nie działa ze względu na rodzaj, kod powinien być:

save :validate => false (not :validation) 
0
# Get object's boolean field and toggle it 
# @param [Object] mongoid object 
# @param [String, Symbol] flag 
# @example 
# foo = User.find('123') 
# toggle_flag!(object: foo, flag: :bar) 

def toggle_flag!(object:, flag:) 
    object.update(flag => !object[flag]) 
    object.save! 
end 
+0

Wyjaśnij swój kod! –

+0

Zrobiłem! Użyłem YARD do wyjaśnienia. – arkhwise

Powiązane problemy