Rails - Должен ли я использовать логические поля или реляционную таблицу? - PullRequest
1 голос
/ 30 января 2009

Модель пользователя имеет три ключа: is_master, is_standard, is_guest, потому что я изначально хотел использовать логические методы activerecord , такие как is_master? или is_power?.

Однако, если было бы лучше создать отношение UserType и создать мои собственные методы, подобные этому:

def master?
   return true if self.user_type = 1
end

Ответы [ 4 ]

2 голосов
/ 30 января 2009

Если отношения мастер / стандарт / гость являются взаимоисключающими (то есть вы можете быть когда-либо только одним из них), тогда поле, в котором хранится тип (в удобочитаемой форме, пожалуйста, - нет непрозрачных чисел) лучше. Вы всегда можете переопределить is_foo? тривиально.

С другой стороны, если у вас может быть учетная запись, которая будет иметь более одной учетной записи master / standard / guest / что угодно одновременно, тогда придерживайтесь отдельных логических полей.

1 голос
/ 01 февраля 2009

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

1 голос
/ 30 января 2009

Если вы посмотрите, как это делает плагин спокойной аутентификации (который включает в себя роли пользователей), они используют таблицу соединений.

Я думаю, что объединение гораздо более читабельно. Использование объединения позволяет вам быть более гибким с вашей ролевой системой.

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

1 голос
/ 30 января 2009

Как администратор БД, я всегда ненавижу, когда люди используют столбцы в качестве флагов, было бы много лишних столбцов. Если это все тот же тип (например, тип учетной записи), я бы поступил так, как предлагает первый ответ (включая использование текста, а не цифр).

Если вам, с другой стороны, это нужно для отдельных флагов или нескольких типов (но с ограниченным числом), я бы на самом деле пошел на двоичный расчет.

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

ех.

FLAGS = {:master => 1, :standard => 2, :guest => 4, :power => 8, 
         :another_flag => 32, :yet_another_flag => 64}

def is_master?
    self.flags & FLAGS[:master]
end

def is_standard?
    self.flags & FLAGS[:standard]
end

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

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