1

私の Rails アプリでは、特定のレコードを「ソフト」削除する必要があるため、DB から実際に削除されることなく非アクティブ化されます。現在、「is_deleted」フラグを使用して実装しています。

私の質問は、このモデルを含む関連付けを処理するためのベスト プラクティスがあるかどうかです。例えば:

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

class Bar
   has_many :foos
end

通常は「アクティブ」な foo のみを扱うことを知って、Bar モデルをセットアップする方法を理解しようとしています。

私はいくつかのアイデアを思いついたので、どちらか一方を使用することの長所/短所があるかどうかを知りたい.

  • has_many 宣言で「条件」修飾子を使用して、削除されたアイテムを除外します。
  • Bar に「active_foos」メソッドを作成して、削除されていないアイテムのみを返します。
  • 「 acts_as_paranoid」ジェムを使用するだけです。私が必要としているものには少し重い気がしますが、おそらく最も簡単です。
4

2 に答える 2

3

act_as_paranoid を使用する 3 番目のオプションが最適です。これは、重い処理の大部分を占め、削除されたか、タイムスタンプの後に削除されたかに関係なく、すべてのレコードをロードする他のオプションも提供するためです。すでに作成およびテスト済みのコードを使用してから、自分で車輪を再発明することをお勧めします。

時間が経つにつれて、アプリが成長するにつれて、論理的に削除されたレコードに対して、より多くのオプションとカスタマイズされたクエリが必要になります。したがって、acts_as_paranoid を使用します。

于 2013-09-01T04:28:56.670 に答える
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
于 2013-09-01T05:08:38.703 に答える