где условия на активной записи рельсов 3 - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь добавить условие, при котором из Модели извлекаются только те записи, которые соответствуют условию.Например, я пытаюсь получить только записи из модели транзакции, где :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, но не знаю, как это сделать.

Любойпредложения?

1 Ответ

14 голосов
/ 15 марта 2012

Это:

.where(:price != 0.00)

- это то же самое, что сказать:

.where(true)

как Символ никогда не будет равняться Флоату; where(true) бессмысленно, поскольку он просто добавляет истинный литерал вашей базы данных ('t' для PostgreSQL, 1 в SQLite и MySQL) к предложению 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}

Когда запрос вводит вас в заблуждение, иногда полезно добавить .to_sql в конце в консоли Rails и посмотреть, что в итоге делает SQL (и если вы не знаете SQL, вам следует изучить его, если вы намерены использовать реляционную базу данных в любом качестве).

Вы хотите отправить сравнение в базу данных, а не делать это внутри Ruby:

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

Я предполагаю, что ваш столбец price является десятичным типом, а не типом с плавающей запятой; если я ошибаюсь, измените его на десятичное прямо сейчас.

...