2016-12-22 9 views
1

定期的なDBエントリに関する簡単な質問。定期的なデータベースエントリ

私はユーザーが旅行をプラットフォームに投稿していると言います。今、ユーザは、これらのトリップが繰り返し発生していると言うことができます。彼女は毎週火曜日と木曜日にその旅行を行います。

さらに面白いことに、すべての旅行には、他のユーザーが作成できるリクエストが添付されています。そして、彼らは毎回の定期的な旅行のためにこれらのリクエストを行うことができます。

私はバックエンドでこのようなケースをどのように扱うのですか? RailsとPostgresの使用。

ありがとうございます!

+0

私はrecurringと呼ばれる新しいモデルを構築したいと思います。旅行にはbelongs_toという名前が付けられています。Tripが繰り返される場合、この新しいモデルを使用して再帰を確立します。リクエストに関しては、おそらくhas_many関係を使って動作させることができます。私たちが本当に必要とするのは、あなたがTripsとRequestsのために既に持っているものと、あなたが再発のために試みたものです。 (私は正規化の大きなファンですが、単純なトリップテーブル内で再帰を行うこともできますが、2日を選択できる1つの属性を持つ方法がわからない限り、2つの「再帰」が必要です) – MageeWorld

答えて

0

旅行ごとに異なるリクエストがある可能性があるため、それぞれに個別のIDが必要です。旅行の作成者が定期的な旅行のすべてのインスタンスを編集または削除したい場合を除いて、非繰り返し旅行とまったく同じように扱うことは理にかなっています。そのためには、定期的なトリップIDと定期的なトリップIDから旅行IDまでの1対多の関係を持つ定期的な旅行のための追加のテーブルを作成し、ユーザーが定期的なトリップIDとトリップIDを所有できるようにすることができます。そうすれば、ユーザインタフェースは論理的に2つの種類を表示でき、紛失することはありません。

トリップが編集または削除されるたびに、定期的なトリップテーブルが更新されるようにしてください。これは、定期的な旅行の一部である旅行への編集または削除を単に許可しないことによって、またはトリップテーブルのテーブルにオプションの定期的な旅行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属性。旅行ごとに追加のレコードを作成する必要があることはわかりません。

もしそうなら、ビジネスロジックでそれを処理したいと思うでしょう。再発の原因であるツアーをフェッチし、(例えば)更新開始日と終了日を持つ新しい旅行を作成し、Queryオブジェクトと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そのロジックが既にどのように実装されているか、これらのレコードがアプリケーションでどのように利用されているかによって異なります。 '要求'が通知のようなものだと仮定すると、クエリは一時的な条件に適合するすべての有効なgis-bound旅行を簡単に取り込み、個々のレコードを作成する必要なしに希望のチャンネルに通知をプッシュできます。 – coreyward

+0

@coreywardこれは正当に見える、ヒントありがとう。私はこれをテストする時間があるまであなたの答えをupvoting。間もなくです。 ;) – MindRave

関連する問題