我正在尝试添加一个条件,其中只从模型中获取满足条件的记录。例如,我试图仅从事务模型中获取:price
大于或不等于0的记录(我已尝试过>和!=但在以下示例中均未使用)。
price = Transaction.where(:company_id => company).where(:price != 0.00)
我也试过这个:
price = Transaction.where(:company_id => company).where(:price != 0.00).collect{|item| if item.price.to_f > 0.00 {item.price.to_f} end}
......以及上述两种不起作用的其他变体。
上面的第一个示例不会产生错误,但根本不起作用。条件被忽略了。第二个示例产生语法错误。
我也很确定有一种方法可以在SQL中使用条件,但不知道如何去做。
有什么建议吗?
答案 0 :(得分:13)
此:
.where(:price != 0.00)
与说法相同:
.where(true)
作为符号永远不会等于浮点数; where(true)
毫无意义,因为它只是将数据库的真实文字(PostgreSQL的't'
,SQLite和MySQL中的1
)添加到WHERE子句中,并且没有做任何有用的事情;例如,如果你说:
Transaction.where(:company_id => company).where(:price != 0.00)
然后你的SQL将在PostgreSQL中以这样结束:
select * from transactions where company_id = #{company} and 't'
这就像说
一样select * from transactions where company_id = #{company}
当查询混乱时,有时在Rails控制台的末尾添加.to_sql
会有所帮助,看看SQL最终会做什么(如果你不知道SQL那么你应该学习它如果您打算以任何身份使用关系数据库)。
您希望将比较发送到数据库,而不是在Ruby中执行:
price = Transaction.where(:company_id => company)
.where('price != ?', 0)
我假设您的price
列是十进制类型而不是浮点类型;如果我错了,那么现在把它改成小数。