条件为零值的Rails

时间:2011-07-13 12:18:57

标签: ruby-on-rails null

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

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为空的数据。

在rails中使用的最佳做法是什么?

我想我没有说清楚我的问题。 在我的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时,我感到惊讶,因为我期待它应该给出相同的结果。

5 个答案:

答案 0 :(得分:52)

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

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

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

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

答案 1 :(得分:14)

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

MyTable.where(my_id: nil).first

答案 2 :(得分:9)

对于DB为NULL,语法应为

my_id IS NULL

所以你可以把它作为:

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

答案 3 :(得分:1)

对于任何关系数据库,谓词 class Result<T> private constructor(val result: T?, val error: String?) { constructor(data: T) : this(data, null) constructor(error: String) : this(null, error) val isError = error != null } @GetMapping suspend fun findAllThings(): Flow<Result<Thing>> { //Reactive DB query, return a flow of things } 总是 false,因为 NULL 永远不等于任何东西 - 甚至不等于 NULL。

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

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

(my_id = NULL )

答案 4 :(得分:0)

我想这就是所谓的“铁轨魔术” 你可以通过范围

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

rails会做

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

more