Проблема при проверке, если данные в базе данных равны нулю в рельсах - PullRequest
0 голосов
/ 07 октября 2018

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

В контроллере мониторинга:

def inscribir
    @student = Student.find(params[:student_id])

    grupoDisponible = Student.buscarMateriaDisponible(params[:student_id],params[:codigo_materia])
    vioMateria = Student.vioCurso(params[:student_id], params[:codigo_materia])
    cumplePromedio = Student.calcPromedio(params[:student_id])
    creditos = Student.calc_credits(params[:student_id])

    @mensaje = "No se pudo asignar monitor a esa materia.\nRazon: "
    @todoBien = true
    if !grupoDisponible
        @todoBien = false
        @mensaje = @mensaje + "El grupo ya tiene monitor disponible."
        puts "El grupo ya tiene monitor disponible."
    end
    if !vioMateria
        @todoBien = false
        @mensaje = @mensaje + "El estudiante no ha visto la materia aun"
        puts "El estudiante no ha visto la materia aun"
    end
    if !cumplePromedio
        @todoBien = false
        @mensaje = @mensaje + "El estudiante no cumple el promedio requerido ser monitor"
        puts "El estudiante no cumple el promedio requerido ser monitor"
    end
    if creditos < 22
        @todoBien = false
        @mensaje = @mensaje + "El estudiante no cumple con los minimos creditos vistos."
        puts "El estudiante no cumple con los minimos creditos vistos."
    end
    if @todoBien
        @mensaje = Student.ingresarMonitoria(params[:student_id], params[:codigo_materia])
        puts @mensaje
    end
end

vioMateria всегда сохраняет ложное значение, то есть функция vioCourse всегда возвращает ложное значение.

Функция vioCourse (в модели):

def self.vioCurso(id_student, cod_subject)

    puts id_student
    puts cod_subject
    logs = Student.find(id_student).logs
    encontrado = false
    logs.each do |log|
        codigo = Subject.find(log.subject_id).codigo
        if codigo == cod_subject
            encontrado = true
        end
    end
    return encontrado
end

Логикаметод в порядке, так как я попробовал логику в консоли rails, заменив переменные существующими значениями, при этом он выполняется, но на веб-странице не всегда выдает false, более того, когда я вхожу на эту страницу, всегда целикомкод выполняется, когда мальчик на кнопку всегда дает ложь, входные параметры в порядке.

Существующие данные в разных таблицах базы данных:

SHELL:

Started POST "/students/1/monitorings/inscribir" for 127.0.0.1 at 2018-10-07 02:57:56 -0500
Processing by MonitoringsController#inscribir as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+6Shqw+1nRkPnPt+ag/51tuJoVsH35Zip4fvsyR5FbCYjAdjECWrN56OOOb2iK5f+yyv8VhCIhYIZOp7IE7lMA==", "codigo_materia"=>"1256", "commit"=>"Buscar", "student_id"=>"1"}
  Student Load (0.0ms)  SELECT  "students".* FROM "students" WHERE "students"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
   (0.0ms)  SELECT COUNT(*) FROM "subjects" WHERE "subjects"."student_id" = ? AND "subjects"."codigo" = ?  [["student_id", 1], ["codigo", 1256]]
1
1256
  CACHE Student Load (0.0ms)  SELECT  "students".* FROM "students" WHERE "students"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Log Load (1.0ms)  SELECT "logs".* FROM "logs" WHERE "logs"."student_id" = ?  [["student_id", 1]]
  Subject Load (1.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Subject Load (1.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  Subject Load (1.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
  Subject Load (0.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 4], ["LIMIT", 1]]
  CACHE Student Load (0.0ms)  SELECT  "students".* FROM "students" WHERE "students"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  CACHE Student Load (0.0ms)  SELECT  "students".* FROM "students" WHERE "students"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  CACHE Log Load (0.0ms)  SELECT "logs".* FROM "logs" WHERE "logs"."student_id" = ?  [["student_id", 1]]
  CACHE Subject Load (0.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  CACHE Subject Load (0.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  CACHE Subject Load (0.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
  CACHE Subject Load (0.0ms)  SELECT  "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ?  [["id", 4], ["LIMIT", 1]]
El estudiante no ha visto la materia aun
  Rendering monitorings/inscribir.html.erb within layouts/students
  Rendered students/_infoest.html.erb (1.0ms)
  Rendered monitorings/_inscripcion.html.erb (0.0ms)
  Rendered monitorings/inscribir.html.erb within layouts/students (40.9ms)
  Student Load (1.0ms)  SELECT  "students".* FROM "students" WHERE "students"."id" = ? ORDER BY "students"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Rendered layouts/_menu.html.erb (4.0ms)
  Rendered layouts/_footer.html.erb (0.0ms)
Completed 200 OK in 284ms (Views: 242.1ms | ActiveRecord: 5.0ms)

HTML-код формы (на виду):

<%= form_tag(inscribir_student_monitoring_post_path) do%>
    <%= text_field_tag 'codigo_materia', nil, placeholder: "Codigo de la materia", class: "EditBox", id: "EditboxCodigoMatInsMat"%>
    <hr id="LinSepComForm">

    <div id="wb_ButtonInsMatInsMat">
        <%= submit_tag "Buscar", id: "ButtonInsMatInsMat", class: "boton", style: "color: #FFFFFF"%> 
    </div>
<% end %>

Спасибо

1 Ответ

0 голосов
/ 07 октября 2018

К сожалению, я не совсем понимаю код и немного ленив, чтобы понять, что это значит.Так что при работе с другими разработчиками использование английских переменных - большая помощь;)

Тем не менее, я подумал, что может быть интересно сообщить вам о лучшем способе реализации метода vioCurso, который не требуетзагружая Student, все их logs и subjects, напрямую запрашивая базу данных проверить, существует ли запись.

def self.vioCurso(student_id, subject_code)
  Subject.joins(:log).merge(Log.where(student_id: student_id)).where(codigo: subject_code).exists?
end

Вы даже можете сделать это областью ActiveRecord:

class Subject < ApplicationRecord
  scope :for_student_and_code, ->(student_id, subject_code) do
    joins(:log).merge(Log.where(student_id: student_id)).where(codigo: subject_code)
  end
end

, а затем выполните

Subject.for_student_and_code(student_id, subject_code).exists?

Чтобы узнать больше о методах joins и merge, ознакомьтесь с соответствующей документацией по API: освоение этих двух методов поможет вам сэкономить много усилий во всехвиды ситуаций.

Я понимаю, что это может не ответить на ваш вопрос, но было слишком долго вставлять комментарии и правильно их форматировать ...

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