2015-05-12 4 views
0

Я довольно новичок в Rails, и у меня возникает проблема, с которой я не могу найти разрешение. Моя модель представляет собой RMA в системе. Когда вы создаете новый экземпляр модели, я бы хотел найти предыдущий номер RMA и создать новый. Конструкция RMA # выглядит как RMA-{year}-NNN =>RMA-2015-001.Rails инициализирует значение модели из базы данных

Мое текущее исполнение использует after_initialize для достижения этой цели. Однако во время тестирования я заметил, что обращение к базе данных во время этого метода вызывает бесконечный цикл.

Это то, что мой код выглядит следующим образом:

after_initialize :after_initialize 

def after_initialize 
    self.rma_number ||= generate_rma_number() 
end 

def generate_rma_number 
    new_rma_array = Array.new 
    new_rma_array.push("RMA") 
    new_rma_array.push(Time.now.year) 

    # Get the last RMA 
    last_rma = Rma.select(:rma_number).order('id desc').first 

    # If there is no RMA 
    if(last_rma == nil) 
    new_rma_array.push("001") 
    return new_rma_array.join('-') 
    end 

    # Split the string 
    current_rma_array = last_rma.rma_number.split('-') 

    # Increment the RMA 
    new_rma_array.push((current_rma_array[2].to_i + 1).to_s.rjust(3, '0')) 
    return new_rma_array.join('-') 

end 

ответ

1

Бесконечный цикл вызывается СМД поиска, которые вы делаете в методе generate_rma_number.

last_rma = Rma.select(:rma_number).order('id desc').first' 

Потому что вы хотите, чтобы before_create не after_initialize. После инициализации запускается каждый раз, когда модель инициализируется. Даже если эти модели уже существуют в db.

+0

Это не будет выполняться до тех пор, пока оно не будет сохранено в базе данных, правильно? Я как бы надеялся показать эту ценность пользователю, когда они создают RMA. Однако я полагаю, что это не совсем необходимо. – fortune

+0

Вы можете проверить свой метод, если rma_number уже установлен –

Смежные вопросы