2009-12-15 5 views
0

У меня есть форма, используемая для записи транзакции. Жидкость перемещается из одного резервуара в другой. Моя форма принимает от танков и танков и количество галлонов. Я бы хотел, чтобы это было введено в базу данных в виде двух строк. Первый - это идентификатор Tank и отрицательное число, а второй - идентификатор Tank ID и положительное число.Вставить две строки на одно действие create в контроллере

Пример: Передача 36 галлонов из бака 1 в резервуар 2

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

Это то, что я достиг бы с легкостью писать код SQL в PHP, но я в растерянности в Rails. Как я могу это сделать из одной формы?

ответ

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 
+0

Я придерживаюсь оригинальной модели. Спасибо за вашу помощь. Я застрял в мысли о транзакциях SQL вместо ActiveRecord. Труднее разобраться, но как только я это вижу, это намного проще. –

+0

Могу ли я поместить это в контроллер? Как перенести параметры из хэша? –

+1

Отредактировано для отображения использования параметров – MattMcKnight

1

Его модель верна. В таблице транзакций в стиле учета используется только идентификатор учетной записи и сумма транзакции. Вы должны использовать транзакцию сохранить, чтобы обе записи сохранялись правильно или обе записи не срабатывали.

Для этого я бы выбрал просто версию тега формы.

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

В контроллере я тогда создавал обе модели переноса и сохранял их вместе как транзакцию.

+1

Обычно имеется идентификатор транзакции, который связывает обе стороны записи вместе. Это отсутствует здесь. – MattMcKnight

+0

Я собираюсь добавить это, поскольку было бы намного проще удалить или отредактировать транзакцию по дороге. –

+0

Сделки в RoR: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html –

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

Ваш контроллер будет очень простым контроллером, как вы видите во всех примерах.

+0

+1 для использования formtastic здесь - http://github.com/justinfrench/formtastic. –