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

0

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

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

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

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

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

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

Теги:
find
activerecord

3 ответа

2

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

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])
  • 0
    Я не могу этого сделать. total_cost не является столбцом в таблице Article. Это метод, который я написал, который суммирует freelance_cost и продукт effort и Article.editor.hourly_rate . Когда я пробую синтаксис, который вы предложили в irb, я получаю: ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'total_cost' in 'field list'
1

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

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

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

1

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню