Size: a a a

pro.rb (Ruby/Rails / RU)

2021 May 07

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
я больше склоняюсь к AR подходу
источник

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
^
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
просто это может от тебя не зависеть)
источник

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
я о том, что там написано на AR скорее всего, а не о том что я хочу)
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
ну то есть смотри, если например все изменения идут через приложение, то можно играться с моделью Author: делать "фейковые" колонки, перенаправлять и всякое такое
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
но если какая-то сторонняя (по отношению к приложению) интеграция лезет напрямую в базу, то надо это решать на другом уровне тогда
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
ну в смысле вдруг у вас там есть микросервис на го, который тоже читает и пишет в эту базу
источник

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
Спасибо, приму к сведенью)
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
да, так вот. если всё через приложение, то сделать можно вот как


class Author
 def email_address
   email_addresses.last&.value
 end

 def email_address=(value)
   email_addresses.find_by(value: email_address)&.mark_for_destruction
   email_addresses.new(value: value)
 end
end


если есть сторонний доступ напрямую к базе, но он только на чтение, то можно сделать вот так


class Author
 after_update :sync_email

 private
 
 def sync_email
   email_address_changed? or return

   email_addresses.find_by(value: email_address_was).destroy
   email_addresses.create(value: email_address)
 end
end


но тогда такой же синхронизатор надо бы сделать и на стороне модели Email, если они могут меняться

если же есть сторонний доступ и на чтение и на запись, то это можно решить только на уровне самой базы - триггеры и все такое
источник

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
сохраню в закладки, пожалуй).
источник

AP

Alex Poznyak in pro.rb (Ruby/Rails / RU)
спасибо вам большое. Вы не первый раз мне помогаете)
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
пожалста)
источник

u

unkmas in pro.rb (Ruby/Rails / RU)
Ещё в транзакции это дело обернуть, чтоб рассинхрона не было
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
так after_update до закрытия транзакции срабатывает
источник

u

unkmas in pro.rb (Ruby/Rails / RU)
Ээээ да ладно
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
ну да, есть же отдельный after_commit
источник

u

unkmas in pro.rb (Ruby/Rails / RU)
Надо будет чекнуть
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
другое дело, что колбеки - говно, но тут уже ничо не поделаешь
источник

МВ

Максим Вейсгейм... in pro.rb (Ruby/Rails / RU)
А почему так?

emal_changed? or return
источник

RU

Roman Usherenko in pro.rb (Ruby/Rails / RU)
а почему нет?
источник