即,
Post.title?
相当于
Post.title.present?
答案 0 :(得分:4)
没有
Object#present?
与调用!obj.blank?
相同。
“属性?”方法最终可能会调用相同的代码,但它可能不会,并且它取决于您正在处理的列类型。
查看这些不返回相同值的最简单方法是访问数字列。假设您在数据库中有foo.score
作为十进制列,并将其设置为零。您会看到以下行为。
foo.score = 0
foo.score? # false
foo.score.present? # true
“?”的代码方法在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