2010-06-14 4 views
0

Для каждой Карты я хотел бы добавить к ним специальный номер, который увеличивается на единицу.Написание простого счетчика в рельсах

Я предполагаю, что могу сделать все это в контроллере.

def create 
@card = Card.new(params[:card]) 
@card.SpecNum = @card.SpecNum ++ 
... 
end 

Or. Я могу быть явно замедленным. И, возможно, лучшим вариантом является добавление таблицы auto-incremement в mysql. Проблема в том, что номер должен начинаться с определенного номера, 1020.

Любые идеи?

+0

Рубин не имеет оператор ++ (или - не удивительно!) –

+0

@John Почему вы говорите «не удивительно»? – Trip

+2

потому что наличие ++ без - было бы странно, не так ли? –

ответ

1

Лично я не ставил эту ответственность в базу данных или контроллер; Мне нравится в модели. Что-то вроде:

/приложение/модели/карты

validates_uniqueness_of :special_number 

def before_validation_on_create 
    self.special_number = CardSpecialNumber.next! 
end 

/приложение/модели/card_special_number

def self.next! 
    last_number_holder = CardSpecialNumber.first 
    if last_number_holder.nil? 
    CardSpecialNumber.create!(:counter => 1020) 
    return 1020 
    end 

    last_number_holder.counter = last_number_holder.counter + 1 
    last_number_holder.save! 
    last_number_holder.counter 
end 
+1

Если это просто число, которое нужно увеличить, я бы поместил его в базу данных, используя последовательность или автоинкремент. База данных может сделать это намного эффективнее, чем вы. Я могу представить случаи, когда вам нужно больше контроля, например. порядок важен, не допускаются отверстия или какой-то странный счет-алгоритм (например, я должен создать число yyyy-mm-xxxx, где xxxx - это счет за этот месяц ... тогда модель действительно лучшее место. выше код всегда будет возвращать 1020, если нет исходной строки. – nathanvda

+0

@nathanvda: Что касается 1020: вы правы, он вернет 1020, если нет начальной строки, но Trip запросил это как конкретное требование. На лице, Я думаю, что это требование (начиная с 1020) было моим решающим фактором для обхода базы данных. Мне нравится код, который работает с различными базами данных: postgres/sqlite3/sqlsever имеют разные способы увеличения. Команды с несколькими базами данных могут быть работой дьявола. –

+0

У меня есть только одна модель для Карт. Нет только для специального номера. Обязательно ли их разделять и сделать Card_Special_Number унаследованным от Карты? – Trip

2

Вы можете установить (и сброс) значение AUTO_INCREMENT в MySQL на каждую таблицу основе используя ALTER TABLE statement:

ALTER TABLE mytable AUTO_INCREMENT = 1020 

ALTER TABLE не является привилегией вы хотите, чтобы все пользователи имели, увидеть об обеспечении его соответствующим образом.

+0

Хм .. Я не хочу менять таблицу. Я хочу изменить столбец. На что я попытался, ALTER COLUMN SpecNum AUTO_INCREMENT = 1020. Он возвратил ошибку для синтаксиса SQL – Trip

+0

@Trip: MySQL допускает только один столбец auto_increment для каждой таблицы; вы используете ALTER TABLE только для установки значения AUTO_INCREMENT в соответствии с предоставленной мной ссылкой документации. –

+0

Ах, потому что другой auto_incrememnter для чего-то еще важного. Думаю, я должен использовать модель в конце концов. – Trip

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