我有以下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還具有破壞事件。
我有以下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還具有破壞事件。
我想這應該工作
Activity.where('activities.type = ? AND activities.sku NOT IN
(SELECT sku from activities where type = ?)', 'create', 'destroy')
,如果你真的想使用活動記錄,這讓你更接近:
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
))
太棒了。但是積極的記錄方式似乎對其他開發者來說很難理解。 – Hopstream
是的,我會用直接的SQL去,但你要求更「軌道」的方式。 –
除非你是不推薦使用Type作爲列名進行STI。 –