2014-09-02 68 views
0

我正在製作一個玩具應用程序來學習Rails 4(不需要克隆教程)。在Rails 4中正確地模擬貨幣交易

用戶註冊(我使用Devise gem來照顧用戶認證),並生成BTC pub/prv密鑰對,並且計算地址並將其顯示給用戶(在閃光消息中),所以他們可以將他們的帳戶關閉。其他用戶註冊,任何人都可以搜索任何人,並且每個用戶都可以動態填充下拉列表,但是當用戶鍵入他們的朋友/助理的姓名(無論他們想向誰發送比特幣)時,都會過濾名稱。目前我只使用testnet作爲這個想法,沒有真正的BTC(別擔心!)。

不管怎麼說,這是我爲這個應用程序建模思路:

class User < ActiveRecord::Base 
    has_many :account 
end 

class Tx < ActiveRecord::Base 
    has_one :receiver, class => "account" 
    belongs_to :user, through :account 
end 

class Account < ActiveRecord::Base 
    belongs_to :user 
    has_many :tx 
end 

爲什麼我不喜歡上面的原因是因爲在我的腦海裏,似乎一個德克薩斯(簡稱交易,因爲交易是在Rails的保留字)實際上屬於兩個用戶,但我的讀數似乎表明,我不能有這樣的事情:

class User < ActiveRecord::Base 
    has_many :tx 
end 

class Tx < ActiveRecord::Base 
    has_one :receiver, class => "user" 
    has_one :sender, class => "user 
end 

哪個這些實現的更好?我很欣賞這種模式的任何見解。

回答

0

我會用第二種方法。爲了便於閱讀,我使用「轉移」而不是「tx」 - 但您可以隨意命名。

class User < ActiveRecord::Base 
    has_many :transfers 
    has_many :received_transfers, :class_name => "Transfer", :foreign_key => "receiver_id" 
end 

class Transfer < ActiveRecord::Base 
    belongs_to :user # Sender 
    belongs_to :receiver, :class => "User" 
end 

測試它:

>> Transfer.create(:user_id => 1, :receiver_id => 2, :amount => 4.00) 
=> #<Transfer id: 1, user_id: 1, receiver_id: 2, amount: #<BigDecimal:7fb3bd9ba668,'0.4E1',9(36)>, created_at: "2014-09-03 04:35:47", updated_at: "2014-09-03 04:35:47"> 

>> User.first.transfers 
=> #<ActiveRecord::Associations::CollectionProxy [#<Transfer id: 1, user_id: 1, receiver_id: 2, amount: #<BigDecimal:7fb3c10682f0,'0.4E1',9(18)>, created_at: "2014-09-03 04:35:47", updated_at: "2014-09-03 04:35:47">]> 

>> User.last.received_transfers 
=> #<ActiveRecord::Associations::CollectionProxy [#<Transfer id: 1, user_id: 1, receiver_id: 2, amount: #<BigDecimal:7fb3bdabace8,'0.4E1',9(18)>, created_at: "2014-09-03 04:35:47", updated_at: "2014-09-03 04:35:47">]> 

編碼愉快!

+0

直到現在纔看到這篇文章!我很欣賞這個建議。當我運行rails生成腳手架時,我應該指定「數量:整數sender_id:整數receiver_id:整數」?我知道模型會自動獲得指定的id,這意味着只有'quantity:integer'需要成爲rails g scaffold命令的一部分嗎?對我來說這沒有意義,因爲交易中的兩個參與者必須是數據庫中的列,但是我不知道這是否通過在Transfer模型中具有關聯來隱式處理。在此先感謝 – 2014-09-07 04:14:26

+0

不用擔心!正確的,您的導軌生成支架需要包含外鍵,否則關聯將失敗。 (至少,根據我的經驗,這樣做更容易) – 2014-09-07 16:13:38