如何处理"放置'发现!'如果User.where(id:0)"在Rails?

时间:2016-06-10 11:40:12

标签: ruby-on-rails ruby activerecord

看看这些代码。

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?方法。

有没有什么好方法可以解决这个问题?

3 个答案:

答案 0 :(得分:2)

它们是不同的方法,具有不同的返回值。我不确定您的用例是什么,但如果您的唯一目的是展示foundnot 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开始),则不会打印任何内容,并且在大多数情况下这是期望的结果。