0

我有一个用于记录交易的表格。液体从一个罐移动到另一个罐。我的表格采用从罐和罐以及转移的加仑数。我希望将其作为两行输入数据库。第一行是来自 Tank ID 和一个负数,第二行是 To Tank ID 和一个正数。

示例:将 36 加仑从储罐 1 转移到储罐 2

    id   | tank_id | tran_amount
   ------------------------------
     1   |    1    |     -36
     2   |    2    |      36

这是我可以轻松地用 PHP 编写 SQL 代码来实现的,但我在 Rails 中不知所措。我怎样才能从一种形式做到这一点?

4

3 回答 3

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
于 2009-12-15T18:06:16.903 回答
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 %>

在控制器中,我将创建两个传输模型并将它们一起保存为事务。

于 2009-12-15T18:22:50.333 回答
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 %>

您的控制器将是一个非常简单的控制器,就像您在所有示例中看到的一样。

于 2009-12-15T18:30:52.700 回答