à savoir, estComment fonctionnent les méthodes de requête d'attribut?
Post.title?
équivalent à
Post.title.present?
à savoir, estComment fonctionnent les méthodes de requête d'attribut?
Post.title?
équivalent à
Post.title.present?
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
Pour 3.2 au moins, le code pour "?" est maintenant stocké dans ActiveRecord :: AttributeMethods :: Query – toxaq