PRIVATE может использоваться для записи или для генерации текстуры для отображения OpenCV. Обычно камера может захватывать максимальное разрешение в формате JPEG без использования форматов YUV или PRIVATE.
У меня есть десятки этих небольших перечислений с 3-300 записями в каждом. Я реализую их как справочные таблицы. У меня нет образцового файла для каждого; я использую некоторое метапрограммирование для генерации модели для каждого, так как каждая таблица имеет тот же набор столбцов (идентификатор, имя, описание).
Так как некоторые наборы имели достаточно элементов для гарантирования их собственной таблицы, это было более последовательно для перемещения их всех в таблицы. Просто другая опция, если у Вас будет больше этих перечислений позже.
Править: Вот то, как я генерирую модели:
ACTIVE_RECORD_ENUMS = %w{
AccountState
ClientType
Country
# ...
}
ACTIVE_RECORD_ENUMS.each do |klass|
eval "class #{klass} < ActiveRecord::Base; end"
klass.constantize.class_eval do
class << self
def id_for(name)
ids[name.to_s.strip.humanize.downcase]
end
def value_for(id)
values[id.to_i]
end
def values
@values ||= find(:all).inject({}) {|h,m| h[m.send(primary_key)] = m.name; h}
end
def ids
@ids ||= self.values.inject({}) {|h, {k, v}| h[v.downcase] = k; h}
end
end
end
end
Этот файл живет в каталоге моделей и включен в application_config.rb
. Это позволяет мне, действительно наполняют как это:
AccountState.ids
# => {"active" => 1, "deleted" => 2}
AccountState.values
# => {1 => "Active", 2 => "Deleted"}
AccountState.id_for("Active")
# => 1
AccountState.value_for(1)
# => "active"
Добавьте следующее:
module ActiveRecord module ConnectionAdapters #:nodoc: class TableDefinition def enum(*args) options = args.extract_options! column_names = args column_names.each { |name| column(name, 'enum', options) } end end end end
к lib/enum/table_definition.rb и включают его в Ваш init.rb.
хорошо, просто прочитайте целый API направляющих, и нашел то, что я не любим neeed и я :( Направляющие не поддерживают emum как собственный тип на миграциях, вот информация, я должен искать плагин или другой метод.
Я буду держать Вас в курсе.
Другая опция: спад до SQL.
def self.up
execute "ALTER TABLE `payments` ADD `status` ENUM('accepted', 'cancelled', 'pending')"
end
См. совет № 3 на http://zargony.com/2008/04/28/five -tips-for-development-rails-applications
Это именно то, что вам нужно!
class User < ActiveRecord::Base
validates_inclusion_of :status, :in => [:active, :inactive]
def status
read_attribute(:status).to_sym
end
def status= (value)
write_attribute(:status, value.to_s)
end
end
HTH
Точно так же гем enumerated_attribute управляет перечислениями на уровне объекта.
enum_attr :status, %w(accepted cancelled ^pending)
Определение строки при миграции
t.string :status
Также предоставляет некоторые полезные функции, такие как методы динамических предикатов.
Вы можете указать тип вручную, используя вместо этого метод t.column
. Rails интерпретирует это как строковый столбец, и вы можете просто добавить валидатор к модели, как предложил Павел:
class CreatePayments < ActiveRecord::Migration
def self.up
create_table :payments do |t|
t.string :concept
t.integer :user_id
t.text :notes
t.column :status, "ENUM('accepted', 'cancelled', 'pending')"
t.timestamps
end
end
def self.down
drop_table :payments
end
end
class Payment < ActiveRecord::Base
validates_inclusion_of :status, :in => %w(accepted cancelled pending)
end
Вы можете попробовать (очень ) исчерпывающий gem Джеффа enumerated_attribute ИЛИ воспользуйтесь этим простым обходным путем:
class Person < ActiveRecord::Base
SEX = [:male, :female]
def sex
SEX[read_attribute(:sex)]
end
def sex=(value)
write_attribute(:sex, SEX.index(value))
end
end
А затем объявите атрибут sex
как целое число:
t.integer :sex
Это сработало для меня очень хорошо! = D