2

私はトランザクションをモデル化しようとしています(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つのどちらがより合理的に聞こえますか?

4

2 に答える 2

1

多分このようなもの:

class User < ActiveRecord::Base
  has_many :transactions
end

class Transaction < ActiveRecord::Base
  belongs_to :user
  has_one :favor
  has_one :recipient, :through => :favor
end

class Favor < ActiveRecord::Base
  belongs_to :transaction
  belongs_to :recipient, :class_name => 'User'
end
于 2012-10-04T20:31:20.917 に答える
1

私は金融アプリケーションの経験があります。そのシステムでは、トランザクションの両側に「2 つのレッグ」を使用しました。一方のレッグはマイナスの金額で、もう一方のレッグは方向に応じてプラスの金額でした。また、金融取引によって 2 つが結び付けられました。このようにして、他の側に煩わされることなく、アカウントのレッグを簡単に要約できます. 少し冗長に思えますが(そうです)、古い簿記の慣習に似ており、ユーザーが送信側または受信側にいる場合、それに基づいて方向を決定する必要がないため、より簡単に要約できます取引の。お金が不思議なことにシステムに現れた場合、ワンレッグトランザクションで簡単に入金と引き出しをモデル化できます。

ちなみに、これには Users を使用しないでください。ユーザーはアカウント (会社など) を共有でき、どのユーザーも複数のアカウントを持つことができるため、アカウントを使用します。そしてもちろん、ユーザーは本当に興味深いものではありません。重要なのはお金だけです。

于 2012-10-04T20:32:25.620 に答える