【发布时间】:2014-05-25 20:57:45
【问题描述】:
让我们保持简单。假设我有一个User 模型和一个Post 模型:
class User < ActiveRecord::Base
# id:integer name:string deleted:boolean
has_many :posts
end
class Post < ActiveRecord::Base
# id:integer user_id:integer content:string deleted:boolean
belongs_to :user
end
现在,假设管理员想要“删除”(隐藏)一个帖子。所以基本上他通过系统将帖子的deleted 属性设置为1。我现在应该如何在视图中显示这篇文章?我应该像这样在帖子上创建一个虚拟属性:
class Post < ActiveRecord::Base
# id:integer user_id:integer content:string deleted:boolean
belongs_to :user
def administrated_content
if !self.deleted
self.content
else
"This post has been removed"
end
end
end
虽然这可行,但我想在大量模型中实现上述内容,并且我不禁觉得将上述比较复制+粘贴到我的所有模型中可能是 DRYer。很多烘干机。
我还认为在我的应用程序的每个可删除模型中添加一个deleted 列也感觉有点麻烦。我觉得我应该有一个“状态”表。您对此有何看法:
class State
#id:integer #deleted:boolean #deleted_by:integer
belongs_to :user
belongs_to :post
end
然后在比较器中查询self.state.deleted?这需要一个多态表吗?我只尝试过一次多态,但我无法让它工作。 (记住,这是一个非常复杂的自我参照模型)。而且这仍然没有解决在我的模型中有一个非常非常相似的类方法来在显示内容之前检查实例是否被删除的问题。
在deleted_by 属性中,我正在考虑放置删除它的管理员ID。但是当管理员取消删除帖子时呢?也许我应该有一个edited_by id。
如何在用户和他的帖子之间建立dependent: :destroy 类型的关系?因为现在我想这样做:dependent: :set_deleted_to_0 而我不知道该怎么做。
此外,我们不只是想将帖子的已删除属性设置为 1,因为我们实际上想更改 administrated_content 发出的消息。我们现在想让它说,This post has been removed because of its user has been deleted。我确信我可以跳进去做一些 hacky,但我想从一开始就做好。
我也尽量避免宝石,因为我觉得我错过了学习。
【问题讨论】:
-
我通常使用一个字段
deleted_at,它是一个日期时间字段。当该字段完成时,表示该记录已被删除(类似于布尔值,但提供日期) -
看看 paranoia gem -> github.com/radar/paranoia
标签: ruby-on-rails