0

トランザクションを記録するために使用されるフォームがあります。液体はあるタンクから別のタンクに移動します。私のフォームには、from タンクと to タンク、および転送されたガロン数が含まれます。これを 2 つの行としてデータベースに入力したいと思います。1 行目は送信元のタンク ID と負の数値で、2 行目は送信元のタンク ID と正の数値です。

例: タンク 1 からタンク 2 に 36 ガロンを移送する

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

これは、PHP で SQL コードを書くことで簡単に達成できたはずのことですが、Rails では途方に暮れています。1つのフォームからこれを行うにはどうすればよいですか?

4

3 に答える 3

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 に答える
1

ここのデータベース モデルに何かが欠けているようです。転送を結び付ける何かが必要ですか? 私はするだろう:

id | from_tank_id | to_tank_id | transfer_amount

Transfer と呼ばれるモデルにあると想定される既存のモデルに行き詰まっている場合は、コントローラーで 2 つを作成することを妨げるものは何もありません。それらをトランザクションに入れるだけです。

#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 に答える