2016-09-13 2 views
1

Hallo Ich habe eine Rails-Anwendung, in dem ich, wenn ein Attribut wissen wollte, geändert wird, welche innerhalb des Hash auftritt lassen Sie mich erklären, ich habe params für @userRuby on Rails Änderungen der Attribute in Aktualisierung erkennen

"foo"=> {"name"=> "name1", "age"=> "15", "height"=> "120"} 

jetzt, wenn ich nur das Alter ändern Attribut i, wenn das Alter

wissen wollen, was ich versuchte, geändert wird, ist @user.foo_changed? aber es wahr geben wird, wenn sich etwas ändert in der foo Hash, aber ich es nur wahr sein wollen, wenn das Alter geändert . Wie kann ich das erreichen?

+0

Sie nach dem Update überprüfen möchten oder vor dem Update? –

+0

@GaganGami vor dem Update – user4965201

+0

Wenn 'foo' eine JSON- oder Hstore-Spalte ist, ist dies nicht möglich. Die Änderungsverfolgung für Schienen funktioniert nur für Spalten/Attribute und führt keine "Tiefenprüfungen" durch. –

Antwort

1

try finden:

if @user.foo.age == params[:user][:foo][:age] 
    # not changed 
else 
    # changed 
end 

ODER

@user.foo.age_changed? # this will work in case foo is associated(nested) model with user and foo table has "age" field 
+1

Ihre ältere war nur arbeiten .. das funktioniert nicht, es sagt undefinierte Methode Alter für # user4965201

+0

tatsächlich in meiner Tabelle ist das foo eine Spalte und es enthält den Wert wie folgt {"name" => "name1", "Alter" => "15 "," height "=>" 120 "} – user4965201

+0

@ user4965201: Ich habe beide Lösungen aktualisiert, wenn es Ihnen hilft, können Sie es akzeptieren –

0

Ruby on Rails etwas Methoden bieten, dies zu tun:

object.attribute_changed? 

zum Beispiel:

User.first.name_changed? 

Haben Sie versucht das?

@user.age_changed? 

können Sie mehr here

+0

das gibt undefinierte Methode age_changed? – user4965201

+0

was ist, wenn ich einen anderen Hash als bar und es enthält auch Alter die Antwort wird dies widersprechen aber sowieso seine geben undefined Methode – user4965201

+0

@ user4965201: überprüfen Sie meine Antwort, lassen Sie mich wissen, wenn es für Sie funktioniert –