Увеличение количества счетов в Rails - PullRequest
0 голосов
/ 02 января 2019

У меня есть User, Job и Invoice модели. Каждый пользователь может создавать свои собственные рабочие места, и у каждой работы есть счет. Теперь мне нужно, чтобы у пользователя 1 был счет-фактура 1, счет-фактура 2 ..... и т. Д., А у пользователя 2 - счет-фактура 1, счет-фактура 2 ... и т. Д. Поэтому я не могу использовать идентификатор.

Теперь в таблице invoices есть столбец invoice_number (целое число). Как я могу увеличить этот invoice_number?

Я пробовал с before_create :invoice_number и

def invoice_number
  self.invoice_number = Invoice.maximum("invoice_number") + 1
end

Но у меня один и тот же номер для всех счетов.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Хотя ответ AbM верен, я думаю, что в этом случае важно также добавить проверку уникальности:

# in your invoice model:
validates :invoice_number, uniqueness: { scope: :user }

before_validation :generate_invoice_number

private
def generate_invoice_number
  self.invoice_number = user.invoices.maximum(:invoice_number).next
end

Кроме того, я бы добавил ограничение базы данных, чтобы эти числа были уникальными для каждого пользователя, дажев маловероятном случае состояния гонки:

add_index :invoices, [:user_id, :invoice_number], unique: true
0 голосов
/ 02 января 2019

Измените имя вашего метода, так как он переопределяет имя атрибута (как вы его называете, когда вы вызываете invoice.invoice_number, он вызывает метод и возвращает Invoice.maximum("invoice_number") + 1 вместо атрибута, хранящегося в базе данных):

before_create :set_invoice_number

def set_invoice_number
  self.invoice_number = self.user.invoices.maximum("invoice_number") + 1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...