2015-07-10 2 views
0

У меня есть метод на моей модели, Case под названием stats, который вычисляет и возвращает хэш со статистикой о модели. Как я могу сделать запрос, который фильтрует результаты этого метода? (Например, если я хочу, чтобы увидеть все результаты, где все случаи имеют процент выигрыша более 50)RoR - Моделирование по данным методов

Все вещей на прицелах, которые я нахожу в Интернете имеет отношение к фильтрации по различным атрибутам модели

+1

Вам нужно выразить, что 'stats' делает в SQL, чтобы вы могли использовать эту логику внутри базы данных. –

ответ

0

В этом случае вы можете использовать метод select.

Case.select{|c| c.stats[:win_percentage] > 50 } 

если статистика является методом

+0

Стоит отметить, что это будет извлекать всю таблицу и выполнять блок для каждой строки, что может быть не очень эффективным. – zetetic

0

экземпляра я предполагаю, что вы имеете дело с моделью ActiveRecord. Если win_percentage столбец, так как кажется, так, вы могли бы сделать:

Case.where("win_percentage > 50") 

Это более эффективно, чем просто с помощью выбора метода, как вы позволяете БД сделать фильтрацию.

Но если вам нужно отфильтровать метод, который не может быть выражен как условие where (т. Е. Не может быть выполнено БД), тогда да, вам нужно прибегнуть к .select { } подход. (В этом случае, если у вас есть много результатов, вы можете использовать .find_in_batches()).

+0

Это не столбец. Тем не менее, у меня есть победы и потери. Было бы более эффективным написать пустой запрос SQL, который вычисляет среднее значение? –

+0

Если у вас много данных, вы можете рассмотреть возможность добавления столбцов для этих характеристик, а затем добавить обратные вызовы (или триггеры db) для их заполнения. Таким образом, вы избегаете вычислять статистику на лету каждый раз. – Benissimo

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