2011-03-09 44 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

相關問題