Обмен методами между ActiveModels - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть простая проблема, но я не знаю, как лучше всего это сделать.

У меня есть два класса ActiveModel (скажем, SimpleUser и User).Я хотел бы поделиться некоторыми реализациями методов между ними (скажем, метод full_name, который объединяет имя и фамилию, чтобы оставаться простым).

В классическом ОО-языке я бы использовал абстрактный класс, которыймои два класса расширились бы.Но в Ruby (и даже в Rails) какой подход лучше?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Существует несколько вариантов:

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

  • ИлиВы можете создать базовый класс, как в обычном объектно-ориентированном языке, и использовать его как абстрактный класс.Если вы хотите убедиться, что никто не злоупотребляет им, вы можете сделать его конструктор закрытым.

Это будет выглядеть так:

class User
  private_class_method :new
end

Примечание: в ActiveRecord(не ActiveModel) есть встроенный способ сделать класс абстрактным.

self.abstract_class = true
0 голосов
/ 26 сентября 2018

Вы можете поместить свой код в app/models/concerns и включить их в обе модели.Например:

  • приложение / модели / проблемы / пользователь / shared_methods.rb
module Concerns::User::SharedMethods
  extend ActiveSupport::Concern
  def full_name
    ...
  end
end
  • приложение / модели / user.rb
class User < ActiveRecord::Base
  include Concerns::User::SharedMethods
  ...
end
  • app / models / simple_user.rb
class SimpleUser < ActiveRecord::Base
  include Concerns::User::SharedMethods
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...