【问题标题】:Ruby on Rails 4 - Where statement crashes when nilRuby on Rails 4 - 当 nil 时,Where 语句崩溃
【发布时间】:2016-05-01 21:13:56
【问题描述】:

我正在尝试按姓氏和娘家姓搜索姓名数据库。但是,如果娘家姓为 nil,则搜索会崩溃。我使用 if/then 语句创建了一个解决方法,但想学习在 ruby​​ 中执行此操作的正确(更清洁)方法。

  if user.maiden_name.nil?        
    x = Alumni.where(firstname: user.first_name, lastname: user.last_name)
  else
    x = Alumni.where(firstname: user.first_name, lastname: [user.last_name, user.maiden_name])
  end

谢谢!

【问题讨论】:

  • 搜索崩溃时收到什么错误?
  • Neven 说的,因为 nil maiden_name 应该没问题。
  • 你是对的,错误实际上是在 .upcase 上,当有一个 nil maiden name 时它会崩溃。有没有办法在 sql 语句中为非空名称添加大写?
  • using: user.maiden_name.try(:upcase) 似乎有效。这是最好的方法吗?
  • 如果您使用的是 ruby​​ 2.3.0,则可以使用安全导航运算符,这与 try 方法非常相似。发行说明中有更多信息:ruby-lang.org/en/news/2015/12/25/ruby-2-3-0-released

标签: ruby-on-rails where


【解决方案1】:

您可以通过将#compact应用于args数组来避免where的条件子句中的nil值,如下所示:

Alumni.where(firstname: user.first_name,
   lastname: [user.last_name, user.maiden_name].compact)

但你真的希望吗?

【讨论】:

  • 谢谢!这是一个非常好的技巧,它实际上也适用于这种情况。
  • 如果我使用这种方法,有什么办法可以做到这一点:Alumni.where("lastname = ?", [user.last_name, user.maiden_name])
  • @user3461645 Alumni.where("lastname IN ?",...) 但是为什么你需要在哪里使用旧式 args 呢?
  • 我需要这样做的唯一原因是因为我需要在语句中使用 OR。
  • @user3461645 所以用 arel 代替
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多