我有一个用于记录交易的表单。液体从一个罐移动到另一个罐。我的表格从坦克和坦克以及转移的加仑数量。我希望将其作为两行输入数据库。第一个是Tank ID和负数,第二行是Tank ID和正数。
实施例: 将36加仑从Tank 1转移到Tank 2
id | tank_id | tran_amount
------------------------------
1 | 1 | -36
2 | 2 | 36
这是我在PHP中轻松编写SQL代码所能实现的,但我在Rails中不知所措。我怎么能从一种形式做到这一点?
答案 0 :(得分:1)
您的数据库模型中似乎缺少某些内容,您是否想要将转移绑定在一起?我愿意:
id | from_tank_id | to_tank_id | transfer_amount
如果您坚持使用现有模型(假设在名为Transfer的模型中),则没有什么可以阻止您在控制器中创建两个模型,只需将它们放入事务中。
#in TransferController.create
amount = params[:amount].to_i
Transfer.transaction do
Transfer.create(:tank_id => params[:from_tank_id], :tran_amount => -amount)
Transfer.create(:tank_id => params[:to_tank_id], :tran_amount => amount)
end
答案 1 :(得分:1)
他的模型是正确的。会计式交易表仅保存账户ID和交易金额。您必须使用事务保存以确保两个记录都正确保存或两个记录都失败。
为此,我只选择简单的表格标签版本。
<% form_tag url => { :controller => "controller", :action => "action" }, :method => "post" do %>
<p>From Account: <%= text_field_tag :from_account %></p>
<p>To Account: <%= text_field_tag :to_account %></p>
<p>Amount: <%= text_field_tag :amount %></p>
<p><%= submit_tag "Transfer" %>
<% end %>
在控制器中,我然后创建两个传输模型并将它们一起保存为事务。
答案 2 :(得分:1)
我会以不同的方式对此进行建模。希望这会给你一些想法......我不确定它是否能正常工作......
class TankTransfer < AR:B
has_one :from_transfer
has_one :to_transfer
attr_accessible :from_tank
attr_accessible :to_tank
attr_accessible :amount_to_transfer
before_create :create_transfers
protected
def create_transfers
self.to_transfer.build(:tank => self.to_tank, :amount => self.amount_to_transfer)
self.from_transfer.build(:tank=> self.from_tank, :amount => -self.amount_to_transfer)
end
end
class Transfer < AR:B
belongs_to :tank
end
class Tank < AR:B
has_many :transfers
end
然后你的表格看起来像(如果你使用的是formtastic):
<% semantic_form_for @tank_transfer do |form| %>
<% form.inputs :name => "Tank transfer" do %>
<%= form.input :from_tank %>
<%= form.input :to_tank %>
<%= form.input :amount_to_transfer %>
<% end %>
<% form.buttons do %>
<%= form.commit_button %>
<% end %>
<% end %>
你的控制器将是一个非常简单的控制器,就像你在所有例子中看到的一样。