2011-03-09 56 views
0

我的代码在某处存在一个小小的逻辑错误,我无法弄清楚究竟是什么问题。让我们从头开始。我的订单类使用了以下扩展名。如何自动映射字符串和属性?

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'创建','in_progress'等,但无法获得其他一些工作。

无论如何自动映射字符串/属性?

回答

1

从您的描述看起来像你正在比较字符串与符号。可能需要添加:

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

或做#to_s在status_names

+0

完全,我改变了扩展名是:包容=> {:在=> status_names.to_s} – mhenrixon 2011-03-09 18:47:58

相关问题