2014-01-10 30 views
0

我有以下Activity表:Rails如何獲得表結果本身的連接?

ID  TYPE  SKU 
======================= 
1  create  ABC 
2  create  DEF 
3  destroy  DEF 

我怎樣才能得到它不具有destroy事件的所有create事件?

Activity.where(type: 'create')給我的ID 1和2

但我只希望在第一行,因爲ID 2還具有破壞事件。

+0

除非你是不推薦使用Type作爲列名進行STI。 –

回答

3

我想這應該工作

Activity.where('activities.type = ? AND activities.sku NOT IN 
    (SELECT sku from activities where type = ?)', 'create', 'destroy') 
+0

謝謝。是否有軌道的方式來做到這一點? – Hopstream

+0

http://stackoverflow.com/questions/4581376/how-to-exclude-an-array-of-ids-from-query-in-rails-using-activerecord –

+0

這似乎並不奏效。我正在使用MySQL。 – Hopstream

1

,如果你真的想使用活動記錄,這讓你更接近:

class Activity < ActiveRecord::Base 
    scope :with_destroy, lambda { where(:action => 'destroy') } 
    scope :create, lambda {where(:action => 'create') } 

    scope :create_without_destroy, lambda { 
    create.where("sku not in (" << Activity.select(:sku).with_destroy.group(:sku).to_sql << ")") 
    } 

end 

生成的SQL:

> Activity.create_without_destroy 
SELECT "activities".* FROM "activities" 
WHERE "activities"."action" = 'create' AND (
    sku not in (
    SELECT 
    sku 
    FROM "activities" 
    WHERE "activities"."action" = 'destroy' 
    GROUP BY sku 
)) 
+0

太棒了。但是積極的記錄方式似乎對其他開發者來說很難理解。 – Hopstream

+0

是的,我會用直接的SQL去,但你要求更「軌道」的方式。 –