代码之家  ›  专栏  ›  技术社区  ›  Joelio

实现已删除属性的Rails

  •  3
  • Joelio  · 技术社区  · 14 年前

    我有一张有很多联系人的表格。我希望能够删除联系人而不真正删除他们,但将他们标记为已删除。我在“联系人”表中添加了一个属性“已删除”。

    在大多数情况下,我只需要未删除的表单联系人:

    form.contacts.find_all_by_deleted(false)
    

    这看起来很混乱,所以我在考虑一个命名的“范围”或默认的“范围”,但很多人似乎说他们是邪恶的。

    我还考虑将窗体上的关系更改为(这与默认范围相同吗?这是邪恶的吗?):

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

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

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

    任何解决方案都必须在Rails 2中工作,而不是在Rails 3中过时。不喜欢插件或gem。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Harish Shetty    14 年前

    方法1:关联:

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

    在管理员控制器中使用 contacts 协会,其他地方使用 active_contacts 联想。

    方法2:默认范围:

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

    对于普通用户:

    u.contacts
    

    对于管理员用户:

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

    我使用默认范围排除 deleted 记录。人们都很不安 default_scope 这是一个很好的理由,因为有时它会导致意想不到的行为。

        2
  •  2
  •   Ricardo Acras    14 年前

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