2012-10-04 3 views
2

내가이 사용 사례에 대한 "책임"인 트랜잭션 (SQL 트랜잭션과는 아무), 모델링하기 위해 노력하고있어 :어떻게 레일에 반 금융 거래를 모델링하는

  • 사용자가 돈을 입금 할 수 있습니다 자신의 선불 계정에
  • 사용자는

한 가지 제안이 트랜잭션 모델에 다음과 같은 속성을 사용하는 다른 사용자에게 사용자가 (부탁을 위해) 돈을 보낼 수

  • 같은 계좌에서 인출 할 수 있습니다 : 센 der_id, receiver_id 및 favor_id. 이 경우, 처음 두 개의 유스 케이스는 사용자 (sender_id와 receiver_id)와 favor_id와 관련된 필드 중 하나를 가지며 belongs_to (트랜잭션은 receiver, sender 및 favor에 속함)의 목적을 다소 상쇄합니다. 다음은이 버전의 코드 조각입니다 :

    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 
    

    두 번째 제안은 각 트랜잭션에 user_id를 사용하는 것입니다 만, 그 경우, 두 사용자 사이의 모든 트랜잭션이 처음 보낸 사람에게 속하는 및 음수를 가진 두 개의 레코드를 만들 것이다, 두 번째는 수신기에 속하며 양수를가집니다. 이 경우, favor_id의 존재 여부는 예금/출금인지 또는 부탁 여부를 나타냅니다.

    어느 쪽이 합리적인 것 같습니까? 이 같은

  • +0

    정확히 내가 알아야 할 것은 무엇입니까! –

    +0

    귀하의 호의에는 항상 그들과 관련된 보상이 있습니까? – iouri

    +0

    예, 모든 호의를 지불합니다 –

    답변

    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 
    
    +0

    건배, 약간의 수정 (Matzi의 의견을 바탕으로)과 함께 사용했지만 의도 한대로 작동합니다. –

    1

    나는 금융 분야에서 경험이있다. 이 시스템에서 우리는 거래의 양면에 "두 다리"를 사용했습니다. 한쪽 다리는 음의 값을 가지며 다른 쪽 다리는 방향에 따라 양의 값을 가지며 또한 금융 거래는 두 값을 함께 유지합니다. 이렇게하면 상대방과 관계없이 계정의 다리를 쉽게 요약 할 수 있습니다. 조금 복잡해 보이지만 (그것은 그렇다) 세관을 지키는 예전 책과 비슷하며, 사용자가 송신 측 또는 수신 측에있을 때이를 기반으로 방향을 결정할 필요가 없기 때문에 더 쉽게 요약 할 수있다. 거래의 돈이 신중하게 시스템에 나타날 때 한쪽 다리가있는 거래를 통해 예금과 인출을 쉽게 모델링 할 수 있습니다.

    그런데이 경우 사용자를 사용하지 않아야합니다. 사용자는 계정 (예 : 회사)을 공유 할 수 있으며 사용자는 여러 개의 계정을 가질 수 있으므로 계정을 사용합니다. 그리고 물론 사용자는 정말로 흥미롭지 않습니다. 중요한 것은 돈뿐입니다.