2013-12-13 4 views
0

Вот мой код для проверки булевых (я использую SQLite)рельсы модели, где значение булева

Swimming::Classstudent.where("swimming_classtimes.date >= ? and student_id = ? and deleted = 'f'",current_date,student_id) 

Очевидно, это выглядит некрасиво.

Я попытался

Swimming::Classstudent.where("swimming_classtimes.date >= ? and student_id = ? and deleted = 0 ",current_date,student_id) 

и

Swimming::Classstudent.where("swimming_classtimes.date >= ? and student_id = ? and deleted = false ",current_date,student_id) 

Они оба не работают. Есть ли лучший способ проверить boolean с where в рельсах?

+2

попробовать это: Плавание :: Classstudent.where ("swimming_classtimes.date> =? и student_id =? ", current_date, student_id) .where (: deleted => false) или это: Плавание :: Classstudent.where (" swimming_classtimes.date> =? and student_id =? and deleted =? ", current_date , student_id, false) –

+0

@Taiki Я попробовал второй, он работает! – wwli

ответ

3

Мое предложение состоит в том, чтобы разбивать ваш запрос на области многократного использования. Код ниже для Rails 4.

class Classstudent 

    scope :after_or_on, -> (date) { where("swimming_classtimes.date >= ?", date) } 

    scope :for_student, -> (id) { where(student_id: id) } 

    scope :active, -> { where(deleted: false) } 

end 

Использование:

Swimming::Classstudent.after_or_on(current_date).for_student(student_id).active 

Это сомнительно, потому что я на самом деле не имеют приложения передо мной. Лично мне не нравится swimming_classtimes join table в области after_or_on. Точка, когда ваши запросы начинают выходить из-под контроля, извлекает различные предложения в области. Это сделает гораздо более читаемый, гибкий и проверяемый код.

**, возможно, потребуется немного настройки так, дайте мне знать, если вы решили идти по этому пути, и никаких проблем **

Смежные вопросы