如何自动在字符串和属性之间进行映射?

时间:2011-03-09 17:29:04

标签: ruby-on-rails-3

我的代码中有一个小的逻辑错误,我无法确切地知道问题是什么。让我们从头开始。我有以下我的订单类使用的扩展名。

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 =='created'并且它正在尝试匹配:created。我尝试将has_statuses设置为'created','in_progress'等,但无法使其他一些工作正常工作。

无论如何要在字符串/属性之间自动映射?

1 个答案:

答案 0 :(得分:1)

从您的描述中看起来就像是在将字符串与符号进行比较。可能需要添加:

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

或在status_names上执行#to_s