как (replace|create) перечислимое поле на направляющих 2,0 миграции?

PRIVATE может использоваться для записи или для генерации текстуры для отображения OpenCV. Обычно камера может захватывать максимальное разрешение в формате JPEG без использования форматов YUV или PRIVATE.

29
задан Gabriel Sosa 29 March 2009 в 01:18
поделиться

9 ответов

У меня есть десятки этих небольших перечислений с 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"
4
ответ дан Sarah Mei 28 November 2019 в 00:55
поделиться

Добавьте следующее:

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.

2
ответ дан Mia Clarke 28 November 2019 в 00:55
поделиться

хорошо, просто прочитайте целый API направляющих, и нашел то, что я не любим neeed и я :( Направляющие не поддерживают emum как собственный тип на миграциях, вот информация, я должен искать плагин или другой метод.

Я буду держать Вас в курсе.

0
ответ дан Gabriel Sosa 28 November 2019 в 00:55
поделиться

Другая опция: спад до SQL.

def self.up
  execute "ALTER TABLE `payments` ADD `status` ENUM('accepted', 'cancelled', 'pending')"
end
0
ответ дан wesgarrison 28 November 2019 в 00:55
поделиться

Вы смотрели на плагин enum-column на RubyForge?

3
ответ дан 28 November 2019 в 00:55
поделиться

См. совет № 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

24
ответ дан 28 November 2019 в 00:55
поделиться

Точно так же гем enumerated_attribute управляет перечислениями на уровне объекта.

enum_attr :status, %w(accepted cancelled ^pending)

Определение строки при миграции

t.string :status 

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

http://github.com/jeffp/enumerated_attribute/tree/master

3
ответ дан 28 November 2019 в 00:55
поделиться

Вы можете указать тип вручную, используя вместо этого метод 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
37
ответ дан 28 November 2019 в 00:55
поделиться

Вы можете попробовать (очень ) исчерпывающий 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

9
ответ дан 28 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: