.finding по методу в ActiveRecord - PullRequest
       4

.finding по методу в ActiveRecord

0 голосов
/ 09 сентября 2010

Я использую ActiveRecord и Ruby (за пределами Rails) для отслеживания статистики.

Я добавил метод (total_cost) в одну из моих моделей для выполнения расчетов с использованием пары столбцов в текущей модели, а также столбца из другой модели.

Мне бы очень хотелось иметь возможность использовать некоторые положения ActiveRecord для математики (усреднения, сумм) и простого старого нахождения с использованием метода, который я определил, но любая попытка сделать это приводит меня (совершенно понятный) к неизвестному столбцу. ошибка, например

Article.find(:all, :conditions => ["total_cost > ?", 300])

В результате я делаю вещи способом, который мы могли бы описать как грубое насилие, просто нахожу все Статьи, затем вставляю total_value каждого в массив и делаю с этим суммы и средние.

Есть ли у меня какие-либо альтернативы помимо того, что я делаю? Должен ли я смотреть мимо ActiveRecord на сам MySQL, чтобы вычислить рассматриваемые значения?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

Вы можете сделать

Article.sum(:total_cost, :conditions => ["total_cost > ?", 300])
Article.average(:total_cost, :conditions => ["total_cost > ?", 300])

С учетом total_cost метод:

total_cost = 'freelance_cost + effort * editor.hourly_rate'
Artice.sum(total_cost, :conditions => ["#{total_cost} > ?", 300], :joins => [:editor])
1 голос
/ 14 сентября 2010

find метод создает SQL.Вы не можете использовать total_cost метод в нем.Так что нужно написать расчет total_cost в SQL.Если вы хотите использовать метод, вы можете отфильтровать необходимые данные от всех.

@articles = Article.find :all
@articles = @articles.select {|a| a.total_cost > 300}

Но этот способ тратит больше ресурсов ..

1 голос
/ 13 сентября 2010

Один из вариантов - преобразовать способ вычисления общей стоимости в выражение SQL, чтобы затем можно было заменить это выражение для любой ссылки, которая может понадобиться для «total_cost» в запросе. Это может быть довольно громоздким, если общая стоимость сложна для расчета или зависит от нескольких таблиц.

Если это возможно, это звучит так, как будто имеет смысл иметь атрибут total_cost на вашей модели Article. Вместо того, чтобы вычисление выполнялось, когда кто-то вызывает метод a.total_cost, вы можете вычислить его при изменении модели с помощью обратного вызова и затем сохранить его. Например:

def before_save
  self.total_cost = ... whatever ...
end

Это позволит вам использовать сумму и усреднить общие затраты. Это было бы гораздо эффективнее, чем получать статьи, рассчитывать общую стоимость каждой из них и затем агрегировать их. Это, вероятно, также будет более эффективным, чем вычисление его каждый раз, когда его запрашивают.

Это решение зависит от значения общей стоимости, не меняющего много. Если он все время меняется в зависимости от изменения различных объектов, то будет более неловко определять, когда должна измениться общая стоимость, и менее эффективно рассчитывать ее таким образом. Это, конечно, облегчит ваши расчеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...