【问题标题】:where conditions on active record rails 3活动记录轨道上的条件 3
【发布时间】:2012-03-15 03:27:41
【问题描述】:

我正在尝试添加一个条件,其中仅从模型中获取满足条件的记录。例如,我试图仅从 :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 中的条件来做到这一点,但不知道如何去做。

有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord rails-activerecord


    【解决方案1】:

    这个:

    .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 列是十进制类型而不是浮点类型;如果我错了,请立即将其更改为十进制。

    【讨论】:

    • @mmichael:是的,如果您使用的是关系数据库,您将无法真正摆脱 SQL,当您知道幕后发生的事情时,解决问题会容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多