Как автоматически сопоставить строки и атрибуты? - PullRequest
0 голосов
/ 09 марта 2011

У меня есть небольшая логическая ошибка где-то в моем коде, и я не могу точно понять, в чем проблема.Начнем с самого начала.У меня есть следующее расширение, которое использует мой класс заказа.

class ActiveRecord::Base   
    def self.has_statuses(*status_names)
      validates :status, 
                :presence => true, 
                :inclusion => { :in => status_names} 

      status_names.each do |status_name|
        scope "all_#{status_name}", where(status: status_name)
      end

      status_names.each do |status_name|
        define_method "#{status_name}?" do
           status == status_name
        end
      end
    end
end    

Это прекрасно работает для запросов и первоначальной установки "статусов".

require "#{Rails.root}/lib/active_record_extensions"
class Order < ActiveRecord::Base
  has_statuses :created, :in_progress, :approved, :rejected, :shipped
  after_initialize :init

  attr_accessible :store_id, :user_id, :order_reference, :sales_person

  private

    def init
      if  new_record?
        self.status = :created
      end
    end
end    

Теперь я установил статус изначально, и это прекрасно работает.Никаких проблем, и я могу сохранить свой новый заказ, как ожидалось.Обновление заказа с другой стороны не работает.Я получаю сообщение:

«Статус не включен в список»

Когда я проверяю, кажется, что order.status == 'создал', и он пытаетсясопоставить: создано.Я попытался установить has_statuses 'create', 'in_progress' и т. Д., Но не смог заставить другие вещи работать.

В любом случае, автоматически сопоставлять строку / атрибут?

1 Ответ

1 голос
/ 09 марта 2011

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

   define_method "#{status_name}=" do
       self.status = status_name.to_sym
    end

или сделайте #to_s в именах статусов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...