2016-12-22 40 views
1

有关重复数据库条目的快速问题。重复数据库条目

假设我有用户在平台上发布他们的旅行。现在,用户可以说这些旅行是反复出现的 - 她/他每周二和周四进行一次旅行。

为了让事情变得更有趣,请说每个行程都附有请求,其他用户可以制作。他们可以为每一次重复旅行做出这些请求。

关于如何在后端处理这种情况的任何想法?使用Rails和Postgres。

在此先感谢!

+0

我会建立一个新的模型,称为重复或任何你想叫它,belongs_to旅程,如果一个旅行是经常性的你使用这个新的模型来建立重现。至于请求 - 你可以通过关系创建一个has_many来使其工作。我们真正需要看到的是您已经对Trips和Requests以及您尝试重现的内容所做的一切。 (尽管我很喜欢规范化,但你可以在简单的旅程表中重现,但在你的例子中,除非你知道有一种方法可以选择两天,否则你需要两次'重复') – MageeWorld

回答

0

由于每次旅行都可以有不同的请求,他们都需要自己的个人ID。除非出现以下情况,否则将其视为与非经常性行程完全相同是有意义的:当行程的创建者想要编辑或删除所有经常性行程的实例时。为此,您可能需要为经常性旅行制作额外的表格,并提供从重复旅行ID到旅行ID的一对多关系,并允许用户拥有经常性旅行ID以及旅行ID。这样用户界面可以在逻辑上显示两种类型,并且不会迷路。

只要确保无论何时编辑或删除行程,都会更新循环行程表。这可以通过简单地禁止编辑或删除作为重复行程一部分的行程来完成,或者使行程表存储可选的经常性行程ID。

1
User 
    has_many :trips 

Trip 
    belongs_to :user 
    has_many :requests 

Request 
    belongs_to :user 
    belongs_to :trip 

添加上Triprecurring_startrecurring_end属性,也许对Request一个recur属性。我不知道你需要为每一次旅行创建任何额外的记录,是吗?

如果是这样,你希望你的业务逻辑处理。喜欢的东西Sidekiq与获取是由于复发的旅程并创建新的行程查询对象(例如)更新的开始和结束日期...

class Trip < ApplicationModel 
    scope :recurring, -> { where(recur: true) } 
    scope :due_for_recurrence, -> { recurring.where(Trip.arel_table[:end_date].lt(Time.now)) } 
end 

您可以使用类似DeepCloneable如果你想自动克隆/ dup相关记录。

+0

这是否工作如果在每个星期二和星期四重复发生,就像在他的例子中那样?对我来说,本能是一个相关的模型,以允许在复发方面具有最大的灵活性,但也许我已经过度正常化了? – MageeWorld

+1

@MageeWorld取决于该逻辑是如何实现的,以及如何在应用程序中使用这些记录。假设你的'request'就像通知一样,一个查询可以很容易地拉出符合时间条件的所有有效的gis-bound行程,然后将通知推送到所需的通道,而不需要创建单独的记录。 – coreyward

+0

@coreyward这看起来合法,谢谢你的提示。提高你的答案,直到我有一些时间来测试这个。哪一个很快。 ;) – MindRave