Добавление вычисляемого столбца в запрос ActiveRecord - PullRequest
6 голосов
/ 14 января 2011

Я выполняю запрос, используя область действия и некоторые условия.Примерно так:

conditions[:offset] = (options[:page].to_i - 1) * PAGE_SIZE unless options[:page].blank?    
conditions[:limit] = options[:limit] ||= PAGE_SIZE
scope = Promo.enabled.active
results = scope.all conditions 

Я бы хотел добавить вычисляемый столбец в запрос (в тот момент, когда я сейчас вызываю scope.all).Примерно так:

(ACOS (минимум (1, COS (0.71106459055501) * * COS (-1.2915436464758) * COS (RADIANS (address.lat)) * COS (RADIANS (address.lng)) + COS (0,71106459055501) * SIN (-1.2915436464758) * COS (RADIANS (address.lat)) * SIN (RADIANS (address.lng)) + SIN (0,71106459055501) * SIN (RADIANS (address.lat)))) * 3963.19) как точный_диски

Есть ли способ сделать это, не используя просто find_by_sql и переписав весь существующий запрос?

Спасибо!

1 Ответ

10 голосов
/ 14 января 2011

Конечно, используйте это:

conditions = Hash.new
conditions[:select] = "#{Promo.quoted_table_name}.*, (ACOS(...)) AS accurate_distance")
conditions[:offset] = (options[:page].to_i - 1) * PAGE_SIZE unless options[:page].blank?    
conditions[:limit] = options[:limit] ||= PAGE_SIZE
scope = Promo.enabled.active
results = scope.all conditions 

Обратите внимание на новое: select - которое сообщает ActiveRecord, какие столбцы вы хотите вернуть.Возвращенный объект в результатах будет иметь метод доступа #accurante_distance.К сожалению, ActiveRecord глуп и не сможет определить тип столбца.Вы всегда можете добавить метод:

class Promo
  def accurate_distance
    raise "Missing attribute" unless has_attribute?(:accurate_distance)
    read_attribute(:accurate_distance).to_f # or instantiate a BigDecimal
  end
end

Подробнее см. # has_attribute .

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