2015-06-22 3 views
6

мне нужно сделать что-то вроде этого:Одинаковые значения перечислений для нескольких столбцов

class PlanetEdge < ActiveRecord::Base 
    enum :first_planet [ :earth, :mars, :jupiter] 
    enum :second_planet [ :earth, :mars, :jupiter] 
end 

Где моя таблица представляет собой таблицу ребер, но каждая вершина представляет собой целое число.

Однако, похоже, что abovove невозможно в рельсах. Что может быть альтернативой созданию столбцов строк?

+0

Может быть, это может Помогите. https://github.com/rails/rails/issues/17511 –

ответ

2

Возможно, это делает извлечение планеты другой моделью?

class Planet < ActiveRecord::Base 
    enum type: %w(earth mars jupiter) 
end 

class PlanetEdge < ActiveRecord::Base 
    belongs_to :first_planet, class_name: 'Planet' 
    belongs_to :second_planet, class_name: 'Planet' 
end 

Вы можете создать PlanetEdge с помощью accepts_nested_attributes_for:

class PlanetEdge < ActiveRecord::Base 
    belongs_to :first_planet, class_name: 'Planet' 
    belongs_to :second_planet, class_name: 'Planet' 

    accepts_nested_attributes_for :first_planet 
    accepts_nested_attributes_for :second_planet 
end 

PlanetEdge.create(
    first_planet_attributes: { type: 'mars' }, 
    second_planet_attributes: { type: 'jupiter' } 
) 
+0

Можете ли вы привести пример того, как вы создадите() PlanetEdge таким образом? – jmasterx

+0

Я обновил ответ. Если это выглядит слишком сложно, вы также можете написать некоторый метод, например 'create_for_planets (first_planet_type, second_planet_type)', который будет выполнять всю работу –

4

Если вы используете Рельсы 5.0 или выше в соответствии с http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

Вы можете использовать: варианты _suffix, когда: _prefix или вам нужно определить несколько перечислений с одинаковыми значениями. Если переданное значение истинно, методы имеют префикс/суффикс с именем перечисления. Также можно поставить пользовательское значение:

class Conversation < ActiveRecord::Base 
    enum status: [:active, :archived], _suffix: true 
    enum comments_status: [:active, :inactive], _prefix: :comments 
end 

В примере выше, челку и предикатные методы наряду с соответствующими областями теперь приставкой и/или суффиксом соответственно:

conversation.active_status! 
conversation.archived_status? # => false 

conversation.comments_inactive! 
conversation.comments_active? # => false 
+0

Это только для версии rails> 5 – new2cpp

+0

pls edit для версии rails :) – hainguyen

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