Как реализовать одноэлементную модель - PullRequest
28 голосов
/ 30 декабря 2008

У меня есть сайт в рельсах, и я хочу иметь настройки для всего сайта. Одна часть моего приложения может уведомить администратора по SMS, если произойдет определенное событие. Это пример функции, которую я хочу настроить с помощью настроек для всего сайта.

Так что я подумал, что у меня должна быть модель настройки или что-то в этом роде. Это должна быть модель, потому что я хочу иметь возможность has_many: контакты для SMS-уведомления.

Проблема в том, что в модели настроек может быть только один пост в базе данных. Я подумал об использовании модели Singleton, но это только мешает созданию нового объекта, верно?

Нужно ли мне создавать методы получения и установки для каждого атрибута следующим образом:

def self.attribute=(param)
  Model.first.attribute = param
end

def self.attribute
  Model.first.attribute
end

Возможно, не рекомендуется использовать Model.attribute напрямую, но всегда создавать его экземпляр и использовать его?

Что мне здесь делать?

Ответы [ 12 ]

1 голос
/ 30 декабря 2008

Использование has_many :contacts не означает, что вам нужна модель. has_many делает немного магии, но в конце концов он просто добавляет метод с указанным контрактом. Нет никаких причин, по которым вы не можете реализовать эти методы (или некоторое подмножество, которое вам нужно), чтобы заставить вашу модель вести себя так, как она has_many :contacts, но фактически не использовать модель ActiveRecord (или модель вообще) для Contact.

0 голосов
/ 14 февраля 2019

Я предполагаю использовать наследующий столбец type с ограничением uniq.

# miragtion
class CreateSingletonRecords < ctiveRecord::Migration[5.2]
  create_table :balance_holders do |t|
    t.string :type
    t.index :type, unique: true

    t.timestamps
  end
end

несколько методов в вашем родительском классе:

class SingletonRecord < ApplicationRecord
  class << self
    def instance
      @singleton__instance__
    end

    def load_record(params = {})
      @singleton__instance__ = find_or_create_by!(params)
    end
  end

  load_record

  validates :type, uniqueness: true
end

После этого вы можете навсегда использовать одну запись для одного класса модели. Ваш экземпляр будет загружен или создан один раз во время загрузки класса модели.

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