2013-09-01 71 views
0

我的Rails應用程序需要做的所以他們實際上沒有從數據庫中移除滅活的某些記錄「軟」刪除。目前我使用「is_deleted」標誌來實現它。Rails的篩選出刪除的記錄在協會

我的問題是,是否有涉及該模型處理協會的最佳做法。例如:

class Foo 
    attr_accessible :is_deleted 
    scope :active, -> { where(is_deleted:false) } 
    belongs_to :bar 
end 

class Bar 
    has_many :foos 
end 

我想弄清楚如何設置酒吧模型,知道它通常只處理'積極'的foos。

我想出了一對夫婦的想法,並想知道是否有使用一個比其他任何優點/缺點。

  • 在has_many聲明中使用「condition」限定符來篩選出已刪除的項目。
  • 在Bar上創建一個「active_foos」方法,只返回未刪除的項目。
  • 只需使用「acts_as_paranoid」寶石。它對我所需要的感覺有點重量級,但也許它是最簡單的。

回答

2

techwineet的建議是體面的。但對於當前的代碼,最簡單的解決方案是將「主動」設置爲默認範圍,如果需要經常處理。

class Foo 
    attr_accessible :is_deleted 
    default_scope -> { where(is_deleted:false) } 
    scope :active, -> { where(is_deleted:false) } 
    scope :deleted, -> { where(is_deleted:true) } 
    belongs_to :bar 
end 

class Bar 
    has_many :foos 
    # optional delegation 
    delegate :active, :delete, to: :foos, prefix: true 
end 

Foo.all   #=> Return active foos. Or better to use Foo.scoped 
Foo.deleted  #=> Return all deleted foos 
Foo.unscoped  #=> Return all foos, both active and deleted 

bar = Bar.first 
bar.foos   #=> Return associated active foos 
bar.foos.active #=> Return associated active foos 
bar.foos.deleted #=> Return associated deleted foos 
bar.foos.unscoped #=> Return all associated foos 

# Optional delegation 
bar.foos_active #=> Return associated active foos 
bar.foos_deleted #=> Return associated deleted foos 
1

使用acts_as_paranoid第三個選項是最好的,因爲它佔據了大部分舉重的同時也爲您提供了其他選擇加載所有記錄是否刪除或某些時間戳之後被刪除。它更好地使用已經編寫和測試的代碼,然後自己重​​新發明輪子。

隨着時間的週期,爲您的應用程序的增長,您將需要在軟刪除的記錄更&更多的選擇和定製的查詢。所以,去與acts_as_paranoid。