Rails 5, проблемы — могут ли они ссылаться на таблицу базы данных?

#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