【问题标题】:rails implementing deleted attribute实现删除属性的rails
【发布时间】:2010-11-05 19:41:04
【问题描述】:

我有一个包含许多联系人的表单。我希望能够删除联系人而不真正删除它们,而是将它们标记为已删除。我在联系人表中添加了一个“已删除”属性。

在大多数情况下,我想要一个表单联系人,我只想要那些未删除的联系人:

form.contacts.find_all_by_deleted(false)

这看起来很乱,所以我在想一个named_scope或一个default_scope,但是很多人似乎说它们是邪恶的。

我还想过只是将表单上的关系更改为(这与默认范围相同吗?它是邪恶的吗?):

has_many :contacts, :conditions => ["deleted = false"]

在我的管理员视图中,我需要能够查看所有联系人。我想我可以从联系人端添加表单的 id 进行查找。

似乎这是人们会大量实施的事情,并且必须有一个公认的最佳实践。

任何解决方案都必须在 Rails 2 中工作,并且不能在 Rails 3 中过时。最好不要使用插件或 gem。

【问题讨论】:

  • 为什么不喜欢使用 gem?为什么您宁愿实现自己的代码,这样工作更多、测试更少、功能更少? ruby-toolbox.com/categories/activerecord_soft_delete.html
  • 嗨,Ryeguy,如果 gems 能够带来显着的价值,它们是很棒的,但缺点是代码的可维护性。对于 1 个问题的一类,添加一个 gem 对我来说似乎有点过分了。如果我想在我所有的模型上使用它,那可能是值得的。许多 gem 维护不善,从 rails 版本迁移会破坏它们,它们会导致意想不到的后果。我们计划非常广泛地部署这个代码库,因此我们尽可能将依赖关系保持在最低限度。查看下面的 KandadaBoggus 建议,这似乎是 2 行代码与另一个 gem。

标签: ruby-on-rails scope


【解决方案1】:

你表现得像个偏执狂:-) http://ar-paranoid.rubyforge.org/

【讨论】:

    【解决方案2】:

    方法 1:关联:

    class User
      has_many :active_contacts, :class_name => "Contact", 
                                :conditions => {:deleted => false}
      has_many :contacts 
    end
    

    在您的管理控制器中使用contacts 关联,其他任何地方都使用active_contacts 关联。

    方法二:default_scope:

    class User
      has_many :contacts 
    end
    
    class Contact
      default_scope {:conditions => {:deleted => false}}
    end
    

    对于普通用户:

    u.contacts
    

    对于管理员用户:

    User.send(:with_exclusive_scope){u.contacts}
    

    我已使用 default_scope 排除 deleted 记录。人们对default_scope 感到不安是有充分理由的,因为它有时会导致意外行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多