条件为零值的Rails

Swe*_*Swe 24 null ruby-on-rails

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

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

没有得到任何数据

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

获取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
Run Code Online (Sandbox Code Playgroud)

解决方案2

MyTable.where("my_id = ? ", nil).first
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*cha 54

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

MyTable.where("my_id IS ?", nil).first
Run Code Online (Sandbox Code Playgroud)

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

MyTable.where(:my_id => parameter).first
Run Code Online (Sandbox Code Playgroud)

  • 查看meta_where(http://metautonomo.us/projects/metawhere/)gem ...使用Arel查询方法中的where子句大大提高了查找内容的方式...伙计,我总是在推动这个宝石.你以为我写了它.我没有,当然...... (2认同)

Boo*_*reg 17

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

MyTable.where(my_id: nil).first
Run Code Online (Sandbox Code Playgroud)


lee*_*asn 9

对于DB为NULL,语法应该是

my_id IS NULL
Run Code Online (Sandbox Code Playgroud)

所以你可以给它:

MyTable.where("my_id is NULL ").first
Run Code Online (Sandbox Code Playgroud)