看看这些代码。
pry> puts User.find_by(id: 0) ? 'Found!' : 'Not found'
Not found
pry> puts User.where(id: 0) ? 'Found!' : 'Not found'
Found!
第一个是好的但是第二个User.where(id: 0)
返回一个空数组,在Ruby的if条件子句中被评估为true
。
我知道有一些方法可以避免这个问题。当您尝试获取"多行"时,其中一个使用empty?
或present?
方法像:
users = User.where(country: 'vietnam')
if users.empty?
...
我认为使用empty?
或present?
是可以的。但是,当您尝试获取单行时,您不必使用此类方法,因为当没有行时,它会返回nil
。
我担心的是,有时您需要empty?
,有时您不需要empty?
。然后代码变得难以阅读。
所以我认为,无论方法是返回多行还是单行,我总是使用empty?
可能会很好。但现在我不想在我的代码中看到empty?
方法。
有没有什么好方法可以解决这个问题?
答案 0 :(得分:2)
它们是不同的方法,具有不同的返回值。我不确定您的用例是什么,但如果您的唯一目的是展示found
或not found
,那么您可以使用exists?。使用present?
或blank?
完全没问题。
User.exists?(id: 0) ? 'Found!' : 'Not found'
#=> "Not Found"
答案 1 :(得分:0)
User.where(id: 0)
替换为
User.where(id: 0).first
答案 2 :(得分:0)
您似乎尝试解决不存在的问题。返回空数组而不是 falsey 是方便,因为在现实世界中,结果将在上运行。也就是说,在你得到结果之后,你可能会想要显示它们。要避免冗余检查,您已经有了一个数组,并且您不需要关心是否有任何记录返回:
User.where(id: 0).each do |u|
puts "Found the user: #{u}"
end.tap do |us|
puts "No one user found" if us.empty?
end
上面的代码打印关于找不到用户的消息,但通常不需要第二部分。如果省略最后2½行(从tap
开始),则不会打印任何内容,并且在大多数情况下这是期望的结果。