Хранить массив или хэш логических значений в Ruby и Rails - PullRequest
0 голосов
/ 20 сентября 2009

Я хочу создать набор значений в Ruby, который я могу хранить и получать в базе данных MySQL под Rails.

В Delphi я бы использовал:

//Create an enumeration with four possible values
type TColour = (clRed, clBue, clBlack, clWhite);
//Create a set which can hold values from the above enumeration
     TColours = set of TColours;
//Create a variable to hold the set
var MyColours = TColours;
begin
  //Set the variable to hold two values from the enumeration
  MyColours = [clRed, clBlack];
  //MyColours now contains clRed and clBlack, but not clBlue or clWhite

  //Use a typecast to convert MyColours to an integer and store it in the database
  StoreInDatabase(Integer(MyColours));

  //Typecast the Integer back to a set to retrieve it from the database
  MyColours := TColours(RetrieveFromDatabase);
end;

Затем я могу использовать Typecast для преобразования в / из целого числа.

Как бы я достиг того же в Ruby / Rails?

Просто чтобы уточнить, предположим, что у меня есть форма с флажками «Красный», «Синий», «Черный», «Белый». Пользователь может выбрать не одно, одно или несколько значений. Как мне сохранить и получить этот набор значений?

Кстати, еще один способ сделать это в Delphi - использовать побитовую математику:

const
  Red = 1;
  Blue = 2;
  Black = 4;
  White = 8;
var MyColours: Integer;
begin
  MyColours := Red+Black; //(or MyColours = Red or Black)

который может быть сохранен и извлечен как целое число

Ответы [ 4 ]

3 голосов
/ 20 сентября 2009

Вот простая реализация для побитового решения:

module Colors
  Red = 1
  Blue = 2
  Black = 4
  White = 8
  ColorsSet = [Red,Blue,Black,White]

  # Mixing valid colors
  def self.mix(*colors) 
    colors.inject{|sum,color| ColorsSet.include?(color) ? color | sum : sum }
  end

  # Get an array of elements forming a mix
  def self.elements(mix)
    ColorsSet.select{|color| color & mix > 0}
  end
end

mix = Colors::mix(Colors::Red,Colors::Blue)

puts mix #=> 3

puts Colors::elements(mix) 
#=> 1
#   2
1 голос
/ 18 ноября 2011

Используйте хороший драгоценный камень: https://github.com/pboling/flag_shih_tzu

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

1 голос
/ 20 сентября 2009

Судя по комментариям и пересмотренному вопросу, вы можете попробовать Плагин Enum Column для Rails . Имеет помощника enum_radio (), который, вероятно, будет полезен в вашей форме.

0 голосов
/ 03 марта 2010

Может быть, вам будет проще

Colors={:red=>1, :blue=>2, :black=>4, :white=>8}
mix = Colors[:blue] + Colors[:black]
Colors.select{|key,value| value & mix > 0}
=> [[:blue, 2], [:black, 4]]
...