【问题标题】:Rails where condition with nil valueRails where条件为零值
【发布时间】:2021-01-28 21:55:37
【问题描述】:

我发现使用 where 和符号 :my_id => nil 并使用 old school one 和 ?是不同的。谁能解释一下为什么?

MyTable.where("my_id = ? ", nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (my_id = NULL ) LIMIT 1

没有得到任何数据

MyTable.where(:my_id => nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (`my_tables`.`my_id` IS NULL) LIMIT 1

获取 my_id 为 null 的数据。

在 Rails 中使用的最佳实践是什么?

我想我没有说清楚我的问题。 在我的 Rails 应用程序中,请求参数为零。 现有的编码是 MyTable.where(:my_id => params[:id]).first 在表中,有很多 my_id 为空的记录。 因此,表中的第一条记录在不知不觉中被拾取。 首先,是的,这是表中数据不干净的问题。

解决这个问题。 我找到了两个解决方案

解决方案 1

if params[:id].present?
  MyTable.where(:my_id => params[:id]).first
end

解决方案 2

MyTable.where("my_id = ? ", nil).first

如你所知,如果我们把(如果条件越来越多),我们的应用程序会变慢,它不会是函数式编程。 当我尝试解决方案 2 时,我感到很惊讶,因为我希望它会给出相同的结果。

【问题讨论】:

  • 对不起,你的问题对我来说没有任何意义了。你想要my_idnil 的记录吗???您上面提到的两种解决方案做了两个完全不同的事情。我的回答和 leenasn 的回答解释了为什么你的“解决方案 2”不起作用。你想要什么?
  • 是的,你是对的。完全有两种不同的东西。我以为他们是一样的。解决方案 1 对我不起作用,因为参数可能为 nil,它会找到具有 NULL 值的记录。我想要的是如果参数为零,则什么也得不到。感谢您的回答。阅读所有答案后,这让我很清楚。谢谢各位

标签: ruby-on-rails null


【解决方案1】:

正确的 SQL 语法是 my_id IS NULL,因此如果您将第一个 sn-p 更改为以下内容,它起作用:

MyTable.where("my_id IS ?", nil).first

两种语法都很好。这取决于你自己的喜好。但是,如果是参数,不知道是不是nil,最好使用:

MyTable.where(:my_id => parameter).first

【讨论】:

  • 你确定吗?我得到ERROR 1064 (42000): You have an error ... near ''a'' at line 1 查询SELECT 'a' IS 'a' 和正确的查询结果SELECT 'a' = 'a'
  • @keymone,是的,我确定。请注意,以上仅适用于nil。对于字符串/整数/布尔值,您确实使用=MyTable.where("name = ?", 'john').first
  • 查看 meta_where (metautonomo.us/projects/metawhere) gem...极大地增强了您使用 Arel 查询方法中的 where 子句查找内容的方式...伙计,我一直在推动这个宝石。你会认为我写的。我当然没有……
【解决方案2】:

在 rails 4 中,您可以使用新的哈希语法将值指定为 null。

MyTable.where(my_id: nil).first

【讨论】:

    【解决方案3】:

    对于 NULL 的 DB,语法应该是

    my_id IS NULL
    

    所以你可以给它:

    MyTable.where("my_id is NULL ").first
    

    【讨论】:

    • 汪。我希望 Rails 有一个 Laravel 风格的界面,比如 MyTable.whereIsNull(:my_id).first
    • 如下评论中提到的,可以使用MyTable.where(my_id: nil).first
    • 我听到你的声音,它工作得很好,但只是希望有一天能有一个替代界面。
    【解决方案4】:

    对于任何关系数据库,谓词(my_id = NULL )总是为假,因为 NULL 永远不等于任何东西——甚至 NULL。

    更完整的解释在这里https://dba.stackexchange.com/questions/166579/why-is-null-ignored-in-query-results/166586#166586

    ActiveRecord 可以很好地处理这个问题,即使数组中包含 null。

    irb(main):029:0> Book.where(id: 1).to_sql
    => "SELECT ... WHERE \"books\".\"id\" = 1"
    irb(main):030:0> Book.where(id: nil).to_sql
    => "SELECT ... WHERE \"books\".\"id\" IS NULL"
    irb(main):031:0> Book.where(id: [1, nil]).to_sql
    => "SELECT ... WHERE (\"books\".\"id\" = 1 OR \"books\".\"id\" IS NULL)"
    

    【讨论】:

      【解决方案5】:

      我想这就是所谓的“rails magic” 你可以通过范围

      Client.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)
      

      变成

      SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' 
                                                          AND '2008-12-22 00:00:00')
      

      或者如果你传递一个子集

      Client.where(:orders_count => [1,3,5])
      

      轨道会做

      SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5))
      

      more

      【讨论】:

      • 这个问题与范围有什么关系?
      • 我认为这与哈希条件与数组条件查询无关
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2022-11-18
      • 2011-05-14
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多