где условия на активных рельсах записи 3

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

Какие-либо предложения?


person vich    schedule 15.03.2012    source источник


Ответы (1)


Этот:

.where(:price != 0.00)

все равно что сказать:

.where(true)

поскольку Symbol никогда не будет равен Float; 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 имеет десятичный тип, а не тип с плавающей запятой; если я ошибаюсь, измените его на десятичный прямо сейчас.

person mu is too short    schedule 15.03.2012
comment
@mmichael: Да, вы не можете уйти от SQL, если используете реляционную базу данных, решать проблемы намного проще, когда вы знаете, что происходит за кулисами. - person mu is too short; 15.03.2012