Rails 3 + Транзакции: как они работают? - PullRequest
0 голосов
/ 24 марта 2012

У меня есть этот код, как вы можете видеть, у меня есть два параметра. И я в одной таблице создаю новые поля, в другой таблице я обновляю поля.

Мне нужно вставить их в MySQL. Все круто, но у меня есть вопрос: как сделать транзакцию, потому что я не хочу вставлять в базу данных только одну из них (обновить или создать). Потому что теперь, если я заполнил один параметр, таблица создается без обновления, но я хочу поместить их ВСЕ в базу данных на ОДИН РАЗ. Итак, мой вопрос ... как сделать транзакцию, чтобы избежать вставки одного из них?

json_grid_params = ActiveSupport::JSON.decode(params[:grid_json]) 
json_form_params = ActiveSupport::JSON.decode(params[:form_json])  

   json_grid_params.each do |json_grid_params|   
    report      = Report.find(:all, :conditions => ["wat_id in (?)", json_grid_params["wat_id"].to_i])

        report.each do |r|
            rr = r.update_attributes(:percent_money => json_grid_params["percent_money"],
                                     :percent_item  => json_grid_params["percent_item"], 
                                     :trend         => json_grid_params["trend"])
        end

        form = FormAnswer.create(json_form_params)

Последнее обновление:

ActiveRecord::Base.transaction do
    json_grid_params = ActiveSupport::JSON.decode(params[:grid_json])
    json_form_params = ActiveSupport::JSON.decode(params[:form_json])  
           json_grid_params.each do |json_grid_params|   
        report = Report.find(:all, :conditions => ["wat_id in (?)", json_grid_params["wat_id"].to_i])
            report.each do |r|
                rr = r.update_attributes(:percent_money => json_grid_params["percent_money"], 
                          :percent_item  => json_grid_params["percent_item"], 
                          :trend         => json_grid_params["trend"])
            rr.save!
            form = FormAnswer.create(json_form_params)
            #form.save!
            end
        end 
end

и в журнале есть эта ошибка: (Если я оставлю grid_params пустым)

NoMethodError (undefined method `save!' for true:TrueClass):
  app/components/report_grid.rb:122:in `block (4 levels) in <class:ReportGrid>'
  app/components/report_grid.rb:118:in `each'
  app/components/report_grid.rb:118:in `block (3 levels) in <class:ReportGrid>'
  app/components/report_grid.rb:116:in `each'
  app/components/report_grid.rb:116:in `block (2 levels) in <class:ReportGrid>'
  app/components/report_grid.rb:113:in `block in <class:ReportGrid>'

Rendered /home/parallels/.rvm/gems/ruby-1.9.3-p0@rails314/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.7ms)
Rendered /home/parallels/.rvm/gems/ruby-1.9.3-p0@rails314/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
Rendered /home/parallels/.rvm/gems/ruby-1.9.3-p0@rails314/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (2.8ms)

1 Ответ

0 голосов
/ 24 марта 2012
ActiveRecord::Base.transaction do
  ...
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...