LINUX.ORG.RU

Как сохранить в БД количество студентов для выбранного курса

 , ,


0

0

Здравствуйте! Помогите мне решить следующую проблему. У меня имеются следующие 4 таблицы: students, courses, years, year_courses. Таблица students имеет следующие поля: name, surname, middle_name, course_id. Итак. В форме год заноcим просто так, выбираем селектом курс и чтобы в поле kolvo_stud сразу менялось значение, которое соответствует числу студентов, только что выбранного курса. То есть, наверное, надо использовать Ajax. Помогите с кодом, пожалуйста! Необходимый результат: сохранение в таблицу YearCourse полей year_id, course_id и kolvo_stud.

Вообщем логика такова

Вообщем логика такова: подходит конец учебного года. Количество студентов устаканилось. Теперь наша задача - занести количество студентов для выбранного курса. То есть - записали в базу данных - дальше не изменяем. А проблема у меня и с подсчётом студентов и как занести их в kolvo_stud. Не понял многого. Не знаю, что писать в экшен new (как подсчитывать студентов). С Ajax очень туго. Мой запрос, наверное, вообще не правильный. Я бы хотел,ч тобы мне подробно показали действия (код) - что выполнить. Главное - результат - сохранение course_id и соответствующее курсу kolvo_id в таблицу YearCourse.

Вот модели для данных таблиц:

class Course < ActiveRecord::Base
  has_many :year_courses, dependent: :destroy
  has_many :years, :through => :year_courses
  has_many :students
end

class Year < ActiveRecord::Base
  has_many :year_courses
  has_many :courses, :through => :year_courses
end

class Student < ActiveRecord::Base
  belongs_to :course
end

class YearCourse < ActiveRecord::Base
  belongs_to :year
  belongs_to :course 
end
 def index
  end

  def new
    @year_course = YearCourse.new
  end

def update_student
    year = params[:year]
    course = params[:course]
    courses = Course.find_by(course_id: course)
    student_count = courses ? courses.students.count : 0

    render :text => student_value  #we are returning the value
  end


  def create
    @course = Course.all
    @year = Year.all
    @student = Student.all
    @year_course = YearCourse.new(year_course_params)

        respond_to do |format|


          if @year_course.save

            format.html { redirect_to @year_course, notice: 'Student was successfully created.' }
            format.json { render action: 'show', status: :created, location: @year_course }
          else
            format.html { render action: 'new' }
            format.json { render json: @year_course.errors, status: :unprocessable_entity }
          end

        end
      end



view/_form

<%= form_for(@year_course,:html => { class: 'login-form'})  do |f| %>
    <table>
      <%= f.select(:year_id, @years.map{|p| [p.name, p.id]}) %>
      <%= f.select(:course_id, @courses.map{|p| [p.id]}) %>
      <%= f.text_field :kolvo_stud, :value => "#{@w}" %>
    </table>
    <div class="footer">
      <input type="submit" name="submit" onclick="validate(this.form)" value="Сохранить данные" class="button" />
    </div>
<% end %>

<script>
on('change',function update_student(course) {
var course = jQuery(".course_id").val();
if(course == ""){
    alert("Please select course ");
    return false;
}
jQuery.ajax({
    url: "update_student",
    type: "GET",
    data: {"course_id" : course },
    dataType: "text",
    success: function(data) {
        jQuery(".class").val(data);
    }
});
});
</script>


Последнее исправление: Egor_Denisovs (всего исправлений: 2)

Ответ на: комментарий от Apple-ch

Помоги, пожалуйста

Помоги, пожалуйста, добрый человек. Как ты говоришь - под копотом (не через форму подсчет). Срочно надо. Я только разбираюсь в Rails.

Egor_Denisovs
() автор топика
Ответ на: Помоги, пожалуйста от Egor_Denisovs

Для начала надо определиться, в каких случаях этот атрибут будет меняться, а потом навесить колбэки для таких случаев.

Для примера:

class YearCourse < ActiveRecord::Base
  belongs_to :year
  belongs_to :course

  after_save :update_students_count

  def update_students_count
    update_column(:students_count, course.students.count)
    true
  end
end

Возможно, у тебя там другая логика, но идея, надеюсь, ясна.

Очевидно, что этот колбэк надо будет запускать и при изменении в студентах и т.д. Плюс можно соптимизировать это дело, что бы не на каждый чих перезаписывать счётчик. Для этого удобно использовать обзёрверы (всё же зря их выпилили из четвёртых рельсов).

Apple-ch ★★
()
Ответ на: комментарий от Apple-ch

Вообщем логика такова

Вообщем логика такова: подходит конец учебного года. Количество студентов устаканилось. Теперь наша задача - занести количество студентов для выбранного курса. То есть - записали в базу данных - дальше не изменяем. А проблема у меня и с подсчётом студентов и как занести их в kolvo_stud. Не понял многого. Не знаю, что писать в экшен new (как подсчитывать студентов). С Ajax очень туго. Мой запрос, наверное, вообще не правильный. Я бы хотел,ч тобы мне подробно показали действия (код) - что выполнить. Главное - результат - сохранение course_id и соответствующее курсу kolvo_id в таблицу YearCourse.

Egor_Denisovs
() автор топика
Ответ на: Вообщем логика такова от Egor_Denisovs

Ещё раз: считать студентов и записывать их количество в контроллере НЕ нужно. Это лучше делать на уровне модели. Как именно это делать, я написал.

Apple-ch ★★
()
Ответ на: Помогите от Egor_Denisovs

Мда, нелегко тебе придётся…

А что в javascript код писать?

Ничего. Вся работа будет проделана в бэкграунде.

Apple-ch ★★
()

Позвольте поинтересоваться, а где задают такие задания? Сессия на носу, товарищ?

vladimir-vg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.