увеличение значения одного столбца на основе значения другого столбца - PullRequest
0 голосов
/ 16 февраля 2010

Этот код не загружает предполагаемое значение в базу данных. Я ожидал, что если 2001 уже существует в качестве значения student_number для записи, в которой есть еще один столбец site 1 (представлен как site_id), то мы увеличиваем student_number на 1, поэтому следующим значением student_number для этого сайта будет 2002, а следующим значением 2003 и т. Д. на. Однако по какой-то причине здесь, если существует 2001, он просто возвращает значение 1, а затем для следующей созданной записи снова возвращает значение 1 и так далее:

Модель студента:

def test!
update_attributes :updater_id => User.current_user.id,
:student_number =>
sitenum = self.site_id
count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}")
if count >= 2001
Student(:condition => { :site_id => sitenum },
  :order => "student_number DESC").student_number + 1
 else
 2001
end
end

Контролер студентов:

def test_finalize
if @student.update_attributes(params[:student]) && @student.test! 
@student.save
end
end

Есть идеи, как увеличить его на 1, если существует 2001? Спасибо за любые предложения.

1 Ответ

1 голос
/ 16 февраля 2010

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

К сожалению, Rails не создает составные ключи из коробки.Существует плагин Composite_primary_keys .У меня нет опыта работы с этим плагином, поэтому ваш пробег может отличаться.

Редактировать: Объяснение того, почему код в вопросе не работает:

Похоже, вы ожидаете результатусловие быть номером студента.Но так оценивается код.

def test!
  update_attributes :updater_id => User.current_user.id,
    :student_number => sitenum = self.site_id

  count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}")
  if count >= 2001
    Student(:condition => { :site_id => sitenum },
      :order => "student_number DESC").student_number + 1
  else
    2001
  end
end

В результате этот тест!возвращает номер студента, которого вы хотите присвоить.

Этот код выполняет то, что вы описали:

def test!
  new_number = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}") + 1
  new_number = new_number > 2000 ? new_number : 2001
  update_attributes :updater_id => User.current_user.id,
    :student_number => new_number    
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...