私はトランザクションをモデル化しようとしています(SQLトランザクションとは関係ありません)。これは、これらのユースケースに対して「責任があります」:
- ユーザーは自分のプリペイド アカウントにお金を入金できます
- ユーザーは同じアカウントからも引き出すことができます
- ユーザーは別のユーザーに(好意のために)送金できます
1 つの提案は、Transaction モデルで次の属性を使用することです。sender_id、receiver_id、および favor_id。この場合、最初の 2 つのユース ケースでは、ユーザー (sender_id と receiver_id) に関連するフィールドの 1 つと、favor_id が nil に設定されます。これは、belongs_to の目的を少し無効にします (トランザクションは、受信者、送信者、および好意に属します)。このバージョンのスニペットは次のとおりです。
class Transaction < ActiveRecord::Base
attr_accessible :sender, :receiver, :favor, :amount
belongs_to :sender, :class_name => "User"
belongs_to :receiver, :class_name => "User"
belongs_to :favor, :foreign_key => "favor_id"
scope :of_user, lambda { |user_id|
where("sender_id = ? or receiver_id = ?", user_id, user_id)
}
scope :external_of_user, lambda { |user_id|
where("(sender_id = ? AND receiver_id IS NULL) or (receiver_id = ? AND sender_id IS NULL)", user_id, user_id)
}
end
2 番目の提案は、各トランザクションで user_id を使用することですが、その場合、2 人のユーザー間のすべてのトランザクションで 2 つのレコードが作成されます。最初は送信者に属し、負の番号を持ち、2 番目は受信者に属し、正の番号を持ちます。この場合、favor_id の存在は、それが入出金であったか、それとも好意の支払いであったかを示します。
これら2つのどちらがより合理的に聞こえますか?