Как добавить строку в столбец ActiveRecord в Rails - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть концепция Акции, которая представляет собой конкретную акцию, принадлежащую конкретному акционеру.Сейчас я пытаюсь добавить функциональность, которая поддерживает отслеживание «истории» этой акции с течением времени, поскольку она может быть передана другим акционерам и т. Д.

В моей базе данных для каждой записи Share естьв настоящее время столбец t.string "transaction_ids".Возможно, мне следует изменить тип столбца, который я предполагаю, на что-то более простое в работе.Открыты для предложений здесь.

Два соответствующих метода - это создание новых акций и передача прав собственности на эти акции.

Вот как изначально создается общий ресурс.

@number_of_share_numbers_to_create.times do |i|
      Share.create(
        owner_id: params[:buying_shareholder_id], 
        captable_id: @transaction.captable.id, 
        company_id: @transaction.company.id, 
        share_number: @latest_share += 1,
        transaction_ids: @transaction.id #Save transaction id to DB
      )
end

Затем, когда передается Share, у меня есть следующий метод.

@share_numbers_on_cap.each do |share|
      share.update_attribute(:owner_id, @buying_shareholder.id)
      # TODO Capture share history by pushing @transaction.id into the transaction_ids column. 
      # Perhaps I could do something like share.transaction_ids >> @transaction.id or something?
end

Я знаю, что это текущее решение не является оптимальным, и мне бы хотелось получить несколько советов о том, как решить эту проблему более масштабируемым образом.Возможно, мне следует использовать другой тип столбца и создать массив?Хотел бы немного подтолкнуть в правильном направлении.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я предлагаю создать другую модель, чтобы «регистрировать» транзакции, которые произошли для определенного Share объекта.

Например:

class ShareTransfer < ApplicationRecord
  belongs_to :share
  belongs_to :transaction
  # don't forget to enforce the presence of 
  # both foreign keys share_id and transaction_id

  # bonus: "freezing" the object after creation so you can never
  # update the logged object (= data integrity)
  before_save(on: :update) do
    errors.add(:base, :immutable, "Cannot update a frozen object")
  end
end

И изменить текущий Share#transaction_ids напростой столбец integer с внешним ключом для таблицы transactions - возможно, также переименованный в него - в итоге получится что-то вроде:

class Share < ApplicationRecord
  belongs_to :transaction # implies you have renamed the column transaction_ids to transaction_id (and changed the column type)
  has_many :share_transfers
end

, который позволяет вам делать следующее, когда Share передано:

@share_numbers_on_cap.each do |share|
  # [your previous logic to change ownership]
  share.share_transfers.create!(transaction_id: share.transaction_id)
  # ^ to create history of the ownership change
end

Эта схема позволяет добавлять дополнительные поля к модели ShareTransfer, например, точное время, когда произошла передача (например: occurred_at), IP-адресобе стороны, когда передача была подтверждена, и т. д. Вы даже можете lock таблицу ShareTransfer «только вставить», не позволяя любому пользователю (или коду) обновлять там данные и обеспечивая целостность ваших журналов.

0 голосов
/ 18 декабря 2018

Вы можете использовать тип столбца массива (если вы используете postgres).Но я бы переместил идентификаторы транзакций в отдельную таблицу БД.Это позволит вам легко добавлять новые идентификаторы и быстро запрашивать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...