Код Rails выполняется дважды в производственном режиме

Я использую Ruby on Rails 2.3.5 и Ruby 1.8.7.

У меня проблема с выполнением кода дважды в производственном режиме. Rails дважды сохраняет данные в таблице, что создает избыточность.

Вот мой контроллер:

  def admission1
  user = current_user
  @student = Student.new(params[:student])
  @selected_value = Configuration.default_country 
  @application_sms_enabled = SmsSetting.find_by_settings_key("ApplicationEnabled")
  @last_admitted_student = Student.find(:last)
  @config = Configuration.find_by_config_key('AdmissionNumberAutoIncrement')
  @categories = StudentCategory.active
  @batches = Batch.active


  if request.post?
    #add student multiple course
    student_batch = params[:student][:batch_id]
    if !student_batch.blank? 
      student_batch.each do |c|
        batch = Batch.find c
        @student.batches << batch unless @student.batches.include? batch
      end
        if @config.config_value.to_i == 1
          @exist = Student.find_by_admission_no(params[:student][:admission_no])
          if @exist.nil?
            @status = @student.save
          else 
              @last_admitted_student = Student.find(:last)
              @student.admission_no = @last_admitted_student.admission_no.next
              @status = @student.save
          end          
        else
          @status = @student.save
        end
    else 
      flash[:notice] = "#{t('insert_batch_record')}"
      redirect_to :controller => "student", :action => "admission1", :id => @student.id
    end

  end
end

Как видите, я пытаюсь сохранить модель студента в базе данных, однако Rails дважды сохраняет пакет student_batches. Вот журнал:

Processing StudentController#admission1 (for 127.0.0.1 at 2015-11-09 21:56:06) [POST]
Parameters: {"action"=>"admission1", "student"=>{"email"=>"", "nationality_id"=>"77", "blood_group"=>"", "state"=>"", "address_line2"=>"", "address_line1"=>"", "student_category_id"=>"", "date_of_birth"=>"2010-11-09", "last_name"=>"", "admission_no"=>"0857", "middle_name"=>"", "gender"=>"m", "country_id"=>"77", "city"=>"", "birth_place"=>"", "batch_id"=>["2"], "first_name"=>"alitia", "phone2"=>"", "phone1"=>"", "pin_code"=>"", "religion"=>"", "admission_date"=>"2015-11-09"}, "controller"=>"student", "commit"=>"► Simpan & Lanjutkan", "authenticity_token"=>"p0NPObfIvU0IjS8NlfKOEfDT5m8I7L0Yt9y8RntjF3Y="}
[4;36;1mUser Columns (2.0ms)[0m   [0;1mSHOW FIELDS FROM `users`[0m
[4;35;1mUser Load (0.0ms)[0m   [0mSELECT * FROM `users` WHERE (`users`.`id` = 1) [0m
[0m
[4;36;1mStudent Create (1.0ms)[0m   [0;1mINSERT INTO `students` (`class_roll_no`, `is_deleted`, `created_at`, `student_batches_id`, `language`, `email`, `photo_data`, `user_id`, `ward_id`, `blood_group`, `nationality_id`, `is_sms_enabled`, `date_of_birth`, `student_category_id`, `address_line1`, `address_line2`, `state`, `updated_at`, `admission_no`, `last_name`, `is_active`, `has_paid_fees`, `middle_name`, `immediate_contact_id`, `photo_file_name`, `photo_file_size`, `gender`, `status_description`, `batch_id`, `birth_place`, `city`, `country_id`, `first_name`, `photo_content_type`, `admission_date`, `religion`, `pin_code`, `phone1`, `phone2`) VALUES(NULL, 0, '2015-11-09 14:56:06', NULL, NULL, '', NULL, 24, NULL, '', 77, 1, '2010-11-09', NULL, '', '', '', '2015-11-09 14:56:06', '0857', '', 1, 0, '', NULL, NULL, NULL, 'm', NULL, 1, '', '', 77, 'alitia', NULL, '2015-11-09', '', '', '', '')[0m
[4;35;1mStudentBatch Columns (2.0ms)[0m   [0mSHOW FIELDS FROM `student_batches`[0m

#here is the problems, it create batch load batch and create another batch. It is supposed to insert the batch only once

[4;36;1mStudentBatch Create (0.0ms)[0m   [0;1mINSERT INTO `student_batches` (`student_id`, `created_at`, `has_fees`, `updated_at`, `batch_id`) VALUES(16, '2015-11-09 14:56:06', 1, '2015-11-09 14:56:06', 2)[0m
[4;35;1mStudentBatch Load (0.0ms)[0m   [0mSELECT * FROM `student_batches` WHERE (`student_batches`.student_id = 16) [0m
[4;36;1mStudentBatch Create (0.3ms)[0m   [0;1mINSERT INTO `student_batches` (`student_id`, `created_at`, `has_fees`, `updated_at`, `batch_id`) VALUES(16, '2015-11-09 14:56:06', 1, '2015-11-09 14:56:06', 2)[0m
[paperclip] Saving attachments.
[4;35;1mSQL (79.6ms)[0m   [0mCOMMIT[0m
[4;36;1mSmsSetting Load (1.0ms)[0m   [0;1mSELECT * FROM `sms_settings` WHERE (`sms_settings`.`settings_key` = 'ApplicationEnabled') LIMIT 1[0m
Redirected to http://localhost:3000/student/admission1_2/16
Completed in 374ms (DB: 100) | 302 Found [http://localhost/student/admission1]

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

Если вам нужны модели, пожалуйста, дайте мне знать. Кстати, я использую Fedena 2.3.5.


person michaelch    schedule 09.11.2015    source источник
comment
Вы действительно используете Rails 2.x или это было потеряно при переводе?   -  person Antarr Byrd    schedule 09.11.2015
comment
Форматирование непоследовательно, и вам нужно провести здесь серьезный рефакторинг, прежде чем кто-то захочет читать этот беспорядок. Бьюсь об заклад, если бы вы реорганизовали это, ваша проблема стала бы очевидной.   -  person Iron Savior    schedule 09.11.2015
comment
@AntarrByrd Да, я использую рельсы 2.3.5. Что вас смущает? Может быть, я могу помочь.   -  person michaelch    schedule 10.11.2015
comment
Это довольно метод.   -  person Dave Newton    schedule 10.11.2015
comment
@michaelch Я бы посоветовал вам перейти на rails 3.2.x или 4.2.x. Rails 2.x очень старый, и количество ваших возможностей найти поддержку по проблемам будет сильно ограничено использованием такой старой версии. Последняя версия 2.x (2.3.8) была выпущена в марте 2013 года. Любые руководства, которые вы читаете или, возможно, не ориентированы на 2.x.   -  person Antarr Byrd    schedule 10.11.2015
comment
@AntarrByrd Здравствуйте, спасибо за ответ. К сожалению, я использую Fedena 2.3. который все еще использует рельсы 2.3. Требуется много времени, чтобы изменить весь код, чтобы он был совместим с рельсами 3 или 4. Код отлично работает в режиме разработки, но не в режиме производства. Он дважды сохраняет пакет при работе в производственном режиме.   -  person michaelch    schedule 10.11.2015


Ответы (1)


student_batch.each do |c|
    batch = Batch.find c
    @student.batches << batch unless @student.batches.include? batch
end

Измените это на

batches=[]
student_batch.each do |c|
        batch = Batch.find c
        batches << batch unless @student.batches.include? batch
end
@student.batches=batches
person Tachyons    schedule 15.12.2015
comment
Привет, спасибо за ответ. Однако код удаляет студенческую группу, и в результате, когда я пытаюсь сохранить учащегося, он конфликтует с моим validate_presence в модели учащегося. Он не сохраняется, потому что он обнаруживает, что студенческая партия пуста. - person michaelch; 15.12.2015
comment
возможно, вы используете проверяющего студента exists_to :batch . но здесь вы отправляете массив пакетов. вам может потребоваться изменить структуру ассоциации - person Tachyons; 28.12.2015