在Rails 4中正确地模拟货币交易

在Rails 4中正确地模拟货币交易

问题描述:

我正在制作一个玩具应用程序来学习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 

哪个这些实现的更好?我很欣赏这种模式的任何见解。

我会用第二种方法。为了便于阅读,我使用“转移”而不是“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