2010-02-16 7 views
0

Этот код не загружает заданное значение в базу данных. Я ожидал, что если 2001 уже существует как значение student_number для записи, у которой есть другой сайт-столбец 1 (представленный site_id), то мы увеличиваем число учеников на 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? Спасибо за любые предложения.

+0

и что произойдет, если INSERT в таблицу студентов происходит во время? –

ответ

1

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

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

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

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

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 
+0

Спасибо, но есть причина, почему код выше не работает, когда я предполагаю, что он должен. Я не уверен, почему он не работает. – JohnMerlino

+0

Этот код является неполным, не получив полного определения метода и зная, как/когда он называется, нет способа ответить на этот вопрос. – EmFi

+0

Я обновил его целиком. Он не используется нигде, что бы изменить его результаты. – JohnMerlino