我的应用程序需要实现执行摄影师比赛的功能。流程如下所示:管理员创建竞赛,然后用户可以申请参与。管理员可以批准请求,也可以拒绝。管理员通过创建响应状态字段分配给ACCEPTED(0)或BANNED(100)的响应来完成此操作。
class Competition
end
class User
end
class CompetitionRequest
belongs_to :user
belongs_to: competition
end
class CompetitionResponse
ACCEPTED = 0
BANNED = 100
belongs_to :competition_request
end
class Photo
belongs_to :competition
end
但后来我需要弄清楚如何过滤禁止的照片,向用户和陪审团展示。 而Photo与CompetitionResponse没有直接联系。 Photo和CompetitionResponse与竞争有关,但我无法弄清楚如何使过滤成为可能。我尝试通过Photo模型中的普通sql(find_by_sql)来做它(它仅在适当的请求被批准时返回记录)但它似乎不是一个好的设计,因为我在Photo模型中的CompetitionResponse类中定义了参考值。
后来我改变了设计并在CompetitionResponse模型中创建了一个before_save过滤器,它检查status == BANNED是否为true,如果为true则标记所有被用户发布的照片(被禁止的请求被禁止)(我添加了一个状态字段)到照片模型)。 但现在我觉得它看起来不太好。 CompetitionRequest模式承担了太多责任。
设计它的最佳方法是什么?可能必须有某种观察者或类似的东西或其他设计模式吗?
答案 0 :(得分:0)
我将采取的第一步是将每张照片分配给用户“belongs_to”。这将允许您随时检查“拥有”用户是否确实被接受或禁止用于照片所指的比赛......
答案 1 :(得分:0)
在我看来,你应该在竞争与用户之间建立多对多的关系。当管理员接受用户参加比赛时,您将关联记录。这使得数据模型中的内容变得简单,并且允许用户在没有请求的情况下参加比赛(可能作为锦标赛的一部分?)。
另外考虑摆脱CompetitionResponse - 看起来这只应该是CompetitionRequest的一个属性,因为只有一个请求响应,对吗?