#ruby-on-rails #ruby #separation-of-concerns #activesupport-concern
#ruby-on-rails #ruby #разделение проблем #activesupport-проблема
Вопрос:
Я пытаюсь узнать о проблемах.
Большинство сообщений в блогах и примеров, которые я могу найти, обсуждают их в контексте переноса методов класса, определенных в модели, в общий репозиторий. Я понимаю эту часть.
Я не понимаю, можно ли использовать проблемы для уменьшения настройки связанных моделей. Например, у меня есть модель пользователя и модель организации. У каждого пользователя и организации будет адрес.
Если address является моделью, он будет полиморфным и будет принадлежать addressable. Тогда у каждого пользователя и организации будет по одному адресу.
Я пытаюсь понять, могу ли я сделать адрес проблемой, а затем включить его в свои пользовательские и организационные модели. Если да, могу ли я по-прежнему иметь в базе данных таблицу с именем address? Мне не ясно, могу ли я иметь таблицу db, если у меня нет модели с именем address (которая мне не понадобилась бы, если бы я использовал подпапку concerns в папке models для определения адреса).
Комментарии:
1. Вероятно, вам следует создать model, если вам нужно иметь доступ к таблице базы данных, а не беспокоиться о ней. Проблемы связаны с уменьшением дополнительной ответственности, которой класс, как предполагается, не должен обладать. Например, допустим, у вас есть класс model:
Product
, теперь вам нужно создать функциональность экспорта CSV для всех ваших продуктов, которые есть в db. Один из способов — расширить эту функциональность в классе product или создать отдельный класс проблем, который занимается этим. Проблема — это «S» в SOLID, что означает, что ваш класс должен иметь дело только с одной ответственностью. Что, если вам понадобится экспортировать xls / json позже?2. хорошо, спасибо за это.
Ответ №1:
Да, вы, безусловно, можете это сделать, и это довольно распространено. Вам все равно понадобятся Address
модель и addresses
таблица в базе данных.
Это выглядело бы примерно так:
# your user model (backed by users table)
class User < ApplicationRecord
include Addressable
end
# your organisation model (backed by organisations table)
class Organisation < ApplicationRecord
include Addressable
end
# your address model (backed by addresses table)
class Address < ApplicationRecord
belongs_to :addressable, polymorphic: true, touch: true
end
# the concern to DRY up shared relation that both user adn organisation have
module Addressable
extend ActiveSupport::Concern
included do
has_one :address, as: :addressable, dependent: :destroy
end
end