在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">]>
编码愉快!
直到现在才看到这篇文章!我很欣赏这个建议。当我运行rails生成脚手架时,我应该指定“数量:整数sender_id:整数receiver_id:整数”?我知道模型会自动获得指定的id,这意味着只有'quantity:integer'需要成为rails g scaffold命令的一部分吗?对我来说这没有意义,因为交易中的两个参与者必须是数据库中的列,但是我不知道这是否通过在Transfer模型中具有关联来隐式处理。在此先感谢 – 2014-09-07 04:14:26
不用担心!正确的,您的导轨生成支架需要包含外键,否则关联将失败。 (至少,根据我的经验,这样做更容易) – 2014-09-07 16:13:38