Rails:设计模型之间的关系

时间:2013-12-25 06:00:45

标签: ruby-on-rails design-patterns

我的应用程序需要实现执行摄影师比赛的功能。流程如下所示:管理员创建竞赛,然后用户可以申请参与。管理员可以批准请求,也可以拒绝。管理员通过创建响应状态字段分配给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模式承担了太多责任。

设计它的最佳方法是什么?可能必须有某种观察者或类似的东西或其他设计模式吗?

2 个答案:

答案 0 :(得分:0)

我将采取的第一步是将每张照片分配给用户“belongs_to”。这将允许您随时检查“拥有”用户是否确实被接受或禁止用于照片所指的比赛......

答案 1 :(得分:0)

在我看来,你应该在竞争与用户之间建立多对多的关系。当管理员接受用户参加比赛时,您将关联记录。这使得数据模型中的内容变得简单,并且允许用户在没有请求的情况下参加比赛(可能作为锦标赛的一部分?)。

另外考虑摆脱CompetitionResponse - 看起来这只应该是CompetitionRequest的一个属性,因为只有一个请求响应,对吗?

相关问题