1

Rails アプリで使用するために、手動の SQL クエリを ActiveRecord クエリに書き直しています。

目的 同じテーブルから 2 つのグループのユーザーを収集します。1 つは先週の対象イベント (44 または 48) で、もう 1 つは 1 か月前に同じ対象イベントのユーザー グループです。

これが現在のクエリです。これを ActiveRecord スコープに変換する方法がわかりません:

select top 500 active_users_last_week.email 
    from (
      select distinct(email) from user_event_tracking
      where event_id in (44,48)
      and sitedb_created_date between getdate()-8 and getdate()-1
      and sitedb_name = 'XYZ'
      and email not like '%@company.com'
      and email not like '%@other_company.com'
    ) active_users_last_week, 
    (
      select distinct(email) from user_event_tracking
      where event_id in (44,48)
      and sitedb_created_date between getdate()-60 and getdate()-30
      and sitedb_name = 'XYZ'
      and email not like '%@company.com'
      and email not like '%@other_company.com
    ) active_users_last_month
where active_users_last_week.email = active_users_last_month.email;

これを ActiveRecord スコープに変える方法について何か提案はありますか? これらはすでにスコープとして設定されています:

scope :active_events, lambda {
    where("event_id in (44,48)")
}

scope :for_property, lambda { |property| 
    where('sitedb_name = ?', property)
}

scope :last_week, lambda {
    where("sitedb_created_date between GETDATE()-8 and GETDATE()-1")
}

scope :last_month, lambda {
    where("sitedb_created_date between GETDATE()-60 and GETDATE()-30")
}

scope :no_test_users, lambda {
    where("email not like '%@company.com' and email not like '%@other_company.com'")
}

スコープはすべて個別に (そして相互に) 機能します。問題は、両方の効率的な方法でメールを取得するEvent.active_events.last_week方法Event.active_events.last_monthです。

4

1 に答える 1

1

これを試して:

Event.select(:email).where(:event_id => [44,48], sitedb_created_date => (8.days.ago..1.day.ago), :sitedb_name => 'XYZ', :email => Event.select(:email).where(:event_id => [44,48], sitedb_created_date => (60.days.ago..30.days.ago), :sitedb_name => 'XYZ').where(Event.arel_table[:email].does_not_match_all(["%company.com","%other_company.com"])))

日付範囲に合わせて日付をいじる必要があるかもしれませんが、それらが含まれているかどうかは 100% わかりません。8.days.ago を 7.days.ago などに変更する必要がある場合があります。

また、スコープでこれを行うことができるはずです:

Event.active_events.last_week.where(:email => Event.active_events.last_month.select(:email))
于 2012-09-21T01:48:30.933 に答える