2014-11-19 3 views
0

Я пытаюсь найти лучшее решение для следующего сценария. У меня есть модель под названием «Статья» с целым полем, называемым «статус». Я хочу, чтобы обеспечить массив уровня класса состояний, как показано ниже,Массив класса уровня класса Ruby-On-Rails

class Article < ActiveRecord::Base 
STATUSES = %w(in_draft published canceled) 

validates :status, presence: true 
validates_inclusion_of :status, :in => STATUSES 

    def status_name 
    STATUSES[status] 
    end 

    # Status Finders 

    def self.all_in_draft 
    where(:status => "in_draft") 
    end 

    def self.all_published 
    where(:status => "published") 
    end 

    def self.all_canceled 
    where(:status => "canceled") 
    end 

    # Status Accessors 

    def in_draft? 
    status == "in_draft" 
    end 

    def published? 
    status == "published" 
    end 

    def canceled? 
    status == "canceled" 
    end 

end 

Так что мой вопрос, если это лучший способ добиться, не имея модели для хранения статусы? И во-вторых, как использовать эти методы в ArticlesController и соответствующих представлениях? Я изо всех сил пытаюсь понять использование этих методов. Чтобы быть конкретным, как это сделать?

article = Article.new 
article.status = ???? 
article.save! 

or 
<% if article.in_draft? %> 

<% end %> 

I greatly appreciate any sample code example. I'm using rails 4.0.0 (not 4.1.0 which has enum support). 
+0

Несомненно, в чем проблема? Как это сделать? Единственное, что я могу добавить, это некоторые константы с разрешенными статусами или просто создавать методы, которые устанавливают их так же, как у вас уже есть методы индикатора состояния. –

+0

Как установить article.status, обозначенный вопросительными знаками. Могу ли я сделать следующее, article.status = Article :: STATUSES [0] или article.status = Article :: STATUSES ['in_draft']? Я не уверен в этом конкретном синтаксисе. – Atarang

+0

Рассматривали ли вы использование конечного автомата? – Stefan

ответ

1

Вы можете определить все методы, использующие define_method и использовать хэш вместо массива:

STATUSES = {:in_draft => 1, :published => 2, :cancelled => 3} 

# Use the values of the hash, to validate inclusion 
validates_inclusion_of :status, :in => STATUSES.values 

STATUSES.each do |method, val| 
    define_method("all_#{method)") do 
    where(:status => method.to_s) 
    end 

    define_method("#{method}?") do 
    self.status == val 
    end 
end 

Таким образом, вы можете добавлять статусы в будущем, без необходимости создания методов вручную , Затем вы можете сделать что-то вроде:

article = Article.new 
article.status = Article::STATUSES[:published] 
... 

article.published? # => true 
+0

Это именно то, что мне нужно было знать. – Atarang

+0

@Atarang Обратите внимание, что в этом случае поле статуса будет целочисленным, но вы можете использовать все, что захотите. –

+0

Да У меня есть статус целочисленного поля. Благодарю. – Atarang

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