2015-03-24 2 views
0

Я пытаюсь создать запрос для подсчета записей, имеющих общий идентификатор, но дважды появляющихся с разными атрибутами на моем сайте, то есть кто-то с определенным IP-адресом создает Impression с именем «view», а затем создает один с name 'conv' (у меня есть пиксель отслеживания и вы хотите подсчитать конверсии через просмотр).Замена SQL CASE несколькими областями в Rails?

На данный момент, я считаю преобразование с использованием Rails запроса ниже, которые я преобразованный из SQL:

@impressions = Impression.select(:ip_address).group(:ip_address).having 
("COUNT(CASE WHEN name = 'view' THEN 1 END) > 0 AND 
COUNT(CASE WHEN name = 'conv' THEN 1 END) > 0") 

Есть уборщик способ сделать это в Rails? Моя первая мысль, что использование нескольких областей может быть лучшим способом:

def self.converted(ip_address) 
    where("name == 'conv' and ip_address == ?", ip_address) 
end 

def self.viewed(ip_address) 
    where("name == 'view' and ip_address == ?", ip_address) 
end 

контроллер (не знаю, как это должно выглядеть ...):

scope :view_through_conversion, Impression.viewed & Impression.converted 

... 

@impressions = Impression.all.view_through_conversion(ip_address) 

Но у меня нет никакого опыта работы с и я не знаю, имеет ли это много преимуществ по сравнению с моим путем. Может ли кто-нибудь дать некоторые рекомендации по наилучшему способу достижения этого в Rails?

ответ

1

уборщик путь в SQL, если я понимаю, ваше намерение правильно, может быть:

@impressions = Impression.select(:ip_address). 
          where(:name => ["view", "conv"]). 
          group(:ip_address). 
          having("count(distinct name) > ?",1) 
Смежные вопросы