在控制器中的一个创建操作上插入两行

时间:2009-12-15 17:57:33

标签: ruby-on-rails forms controller action

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

实施例: 将36加仑从Tank 1转移到Tank 2

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

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

3 个答案:

答案 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 %>

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