2009-09-24 6 views

Répondre

4

n °

Object#present? est la même chose que d'appeler !obj.blank?.

L '"attribut?" La méthode peut finir par appeler le même code, mais elle peut ne pas l'être, et cela dépend du type de colonne que vous utilisez.

La manière la plus simple de voir ces valeurs ne pas retourner la même valeur est d'accéder à une colonne numérique. Imaginons que vous ayez foo.score sous la forme d'une colonne décimale dans votre db, et que vous le définissez sur zéro. Vous verriez le comportement suivant.

foo.score = 0 
foo.score? # false 
foo.score.present? # true 

Le code pour le "?" La méthode est dans ActiveRecord :: AttributeMethods.

def query_attribute(attr_name) 
    unless value = read_attribute(attr_name) 
    false 
    else 
    column = self.class.columns_hash[attr_name] 
    if column.nil? 
     if Numeric === value || value !~ /[^0-9]/ 
     !value.to_i.zero? 
     else 
     return false if ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.include?(value) 
     !value.blank? 
     end 
    elsif column.number? 
     !value.zero? 
    else 
     !value.blank? 
    end 
    end 
end 
+1

Pour 3.2 au moins, le code pour "?" est maintenant stocké dans ActiveRecord :: AttributeMethods :: Query – toxaq

Questions connexes