条件为零值的Rails

我发现使用符号的地方:my_id => nil并使用旧的学校一个? 是不同的。 谁能解释我为什么?

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应用程序中,请求参数为nil。 现有的编码是MyTable.where(:my_id => params [:id])。首先在表中,有很多记录,其中my_id为null。 因此,表中的第一条记录没有意识到。 首先,是的,这是表中不清洁数据的问题。

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

解决方案1

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

解决方案2

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

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

正确的SQL语法是my_id IS NULL ,因此如果您将第一个代码段更改为以下代码, 它将起作用:

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

两种语法都非常好。 这取决于您自己的偏好。 但是,如果它是一个参数,你不知道它是否nil ,你最好使用:

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

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

 MyTable.where(my_id: nil).first 

对于DB为NULL,语法应该是

 my_id IS NULL 

所以你可以给它:

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

我想它可以通过范围所谓的“轨道魔法”

 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)) 

更多