Ruby on rails 其中活动记录轨道上的条件为3

Ruby on rails 其中活动记录轨道上的条件为3,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Rails Activerecord,我试图添加一个条件,其中只从模型中获取满足条件的记录。例如,我尝试只从:price大于或不等于0的事务模型中获取记录(我尝试了>和!=但在下面的示例中两者都不起作用) 我也试过: price = Transaction.where(:company_id => company).where(:price != 0.00).collect{|item| if item.price.to_f > 0.00 {item.price.to_f} end} …以及上述两种方法中不起作用的其他

我试图添加一个条件,其中只从模型中获取满足条件的记录。例如,我尝试只从
:price
大于或不等于0的事务模型中获取记录(我尝试了>和!=但在下面的示例中两者都不起作用)

我也试过:

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中使用条件实现这一点,但我不知道如何实现这一点

有什么建议吗?

这是:

.where(:price != 0.00)
也就是说:

.where(true)
作为一个符号永远不会等于一个浮点数
where(true)
是毫无意义的,因为它只是将数据库的真实文本(PostgreSQL为
't'
,SQLite和MySQL为
1
)添加到where子句中,而这没有任何用处;例如,如果你说:

Transaction.where(:company_id => company).where(:price != 0.00)
在PostgreSQL中,您的SQL将以如下方式结束:

select * from transactions where company_id = #{company} and 't'
这就等于说

select * from transactions where company_id = #{company}
当一个查询让您感到困惑时,有时在Rails控制台的末尾添加一个
。到\u sql
,看看sql最终做了什么是很有帮助的(如果您不懂sql,那么如果您打算以任何能力使用关系数据库,您应该学习它)

您希望将比较发送到数据库,而不是在Ruby中执行:

price = Transaction.where(:company_id => company)
                   .where('price != ?', 0)

我假设您的
price
列是十进制类型,而不是浮点类型;如果我错了,现在就把它改成十进制。

@mmichael:是的,如果你使用的是关系数据库,你就无法真正摆脱SQL,如果你知道幕后发生了什么,解决问题就容易多了。
price = Transaction.where(:company_id => company)
                   .where('price != ?', 0)