我的代码中有一个小的逻辑错误,我无法确切地知道问题是什么。让我们从头开始。我有以下我的订单类使用的扩展名。
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'等,但无法使其他一些工作正常工作。
无论如何要在字符串/属性之间自动映射?
答案 0 :(得分:1)
从您的描述中看起来就像是在将字符串与符号进行比较。可能需要添加:
define_method "#{status_name}=" do
self.status = status_name.to_sym
end
或在status_names上执行#to_s