2013-08-07 2 views
4

Я использую драгоценный камень «flag_shih_tzu», и я хочу знать, что такое максимальное количество флагов, которое оно может обрабатывать, или оно зависит от int. длина в столбце flags?
Мне нужно, чтобы он обрабатывал 64 флага.
не правда ли?Какое максимальное количество флагов flag_shih_tzu может обрабатывать?

+2

Этот вопрос не соответствует теме, потому что он должен спросить на странице GitHub для проекта (https://github.com/pboling/flag_shih_tzu) –

+3

@Ryan Bigg: Являются ли вопросы о драгоценных камнях, не связанных с StackOverflow? Разве Rails не камень? –

ответ

6

Я являюсь хранителем flag_shih_tzu.

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

Обход проблемы: одна таблица может иметь несколько столбцов флагов.

Я хотел бы создать дизайн следующим образом:


class Foo ... 

    has_flags 1 => :is_a1, 
      # ... snip ... 
      16 => :is_a16, 
      :column => 'flag_col_a' 

    has_flags 1 => :is_b1, 
      # ... snip ... 
      16 => :is_b16, 
      :column => 'flag_col_b' 

    has_flags 1 => :is_c1, 
      # ... snip ... 
      16 => :is_c16, 
      :column => 'flag_col_c' 

    has_flags 1 => :is_d1, 
      # ... snip ... 
      16 => :is_d16, 
      :column => 'flag_col_d' 
end 

Теперь, когда у вас есть экземпляр Foo:


foo = Foo.new 
foo.is_d16 = false 
foo.save 

Теперь вы можете восстановить Foo так:


Foo.not_is_d16 # => [foo] 

И если вы хотите также проверить другие флаги в том же запросе, вы должны объединить условия вместе (в побитовом оптимизированном mann er) следующим образом:


Foo.chained_flags_with(:not_is_d16, :is_d1, :is_d4, :not_is_d11, :is_d14) # => array of Foo objects matching the conditions 

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

Важная информация Цепные флага могут быть связаны только с флагами из той же колонны.


Foo. 
    chained_flags_with(:not_is_a1, :is_a2). # from flag_col_a 
    chained_flags_with(:not_is_b3, :is_b4). # from flag_col_b 
    chained_flags_with(:not_is_c8, :is_c11). # from flag_col_c 
    chained_flags_with(:not_is_d13, :is_d14) # from flag_col_d 

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

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

Смежные вопросы