1

我的 rails 应用程序需要对某些记录进行“软”删除,以便它们被停用,而不会实际从数据库中删除。目前我用“is_deleted”标志实现了它。

我的问题是是否有处理涉及此模型的关联的最佳实践。例如:

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

class Bar
   has_many :foos
end

我试图弄清楚如何设置 Bar 模型,知道它通常只处理“活动”foos。

我提出了一些想法,并想知道使用其中一个是否有任何优点/缺点。

  • 在 has_many 声明上使用“条件”限定符来过滤掉已删除的项目。
  • 在 Bar 上创建一个“active_foos”方法以仅返回未删除的项目。
  • 只需使用“ acts_as_paranoid ”宝石。对于我需要的东西来说,它感觉有点重,但也许是最简单的。
4

2 回答 2

3

使用acts_as_paranoid 的第三个选项是最好的,因为它占用了大部分重量级的工作,它还为您提供了其他选项来加载所有记录,无论是在某个时间戳之后删除还是删除。最好使用已经编写和测试过的代码,然后自己重​​新发明轮子。

随着时间的推移,随着您的应用程序的增长,您将需要更多和更多的选项以及对软删除记录的自定义查询。所以,选择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 回答