Множество полей в модели, но для каждого из них требуется атрибут public / private - PullRequest
1 голос
/ 12 августа 2010

У меня есть модель, где почти каждое поле должно иметь открытый / закрытый флаг (логический) для каждого элемента.Сначала я думал, что я сделаю логическое значение для каждого поля, однако я не уверен, что это лучший способ справиться с этим.Есть ли способ лучше?Я за все предложения.

Ответы [ 3 ]

0 голосов
/ 12 августа 2010

Я бы лучше инкапсулировал ваш класс, сделав все ваши переменные приватными и предоставив методы get для каждой переменной. Это также облегчает добавление переменных позже.

0 голосов
/ 12 августа 2010

Вы также можете использовать карту флага (см. Dm-types, как это будет работать) и массив в каждом классе, который определяет положение столбцов в карте флага.Затем перезапишите устройства чтения атрибутов, чтобы они возвращали nil, если @visible не установлено в значение true, если поле помечено как закрытое через карту флага.Счастливого битшифтинга; -)

0 голосов
/ 12 августа 2010

Полагаю, это будет зависеть от нескольких вещей, в том числе от того, кто изменит его и как часто его нужно будет менять. Если это просто конфигурация, которая будет меняться редко, если вообще - тогда, я бы поместил ее в файл конфигурации или в какой-нибудь инициализатор:

PUBLIC_FIELDS = %w(field_one, field_two, field_three)
PRIVATE_FIELDS = %w(field_four, field_five, field_six)

Если это что-то, что должно было быть динамичным и статичным для приложения, когда пользователи могли бы регулярно изменять информацию, я бы выбрал отдельную модель, называемую field_visibility, со следующими полями field_name, visibility. Я бы сначала загрузил поля в качестве начальных данных, а затем дал бы пользователю пользовательский интерфейс для изменения. Я бы дал модели две названные области:

named_scope :public_fields, :conditions => {:visiblity => 'public'}
named_scope :private_fields, :conditions => {:visiblity => 'private'}

Конечно, вы можете использовать битовое поле вместо строки. Вы также можете добавить имя таблицы в модель, если это будет распространяться на дополнительные модели.

Тогда в модели, к которой это относится, вы могли бы сделать несколько вещей, чтобы сослаться на них. включая именованные области:

named_scope :public_fields, :select => FieldVisiblity.public_fields

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

Надеюсь, это поможет!

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