0

我正在访问一个 Web 服务,它以 XML 形式返回数据,这些数据被填充到自定义模型中。其中一个节点称为 AccountType,并且有 2 个子节点,代码和描述。

因此,从 Web 服务返回,它看起来像这样:

...
<AccountType>
  <Code>ABC</Code>
  <Description>Description for ABC</Description>
</AccountType>
...

一旦将其传输到自定义模型中,就可以从 Account 类的实例以编程方式访问这些值,如下所示:

myAccount.account_type_code
=> ABC
myAccount.account_type_description
=> Description for ABC

帐户类型有少量可能的值,我需要能够根据帐户关联的帐户类型来编程逻辑。所以我想枚举 Account 类中的可能值,目标是能够编写如下所示的代码:

if (myAccount.account_type_code == Account.account_types.ABC)
  ...do something...
end

另一个让我复杂的方面是,存在与帐户类型相关联的代码和描述,因此枚举的定义可能需要如下所示:

def self.account_classes
  {
    :ABC => { :code=>"ABC", :description=>"Description for ABC" }
    ,:DEF => { :code=>"DEF", :description=>"Description for DEF" }
  }
end

这将需要逻辑看起来像这样:

if (myAccount.account_type_code == Account.account_types[:ABC][:code])
  ...do something...
end

实际上,逻辑将仅取决于代码,但将描述存储在其中可能对测试/用户消息有用。

此功能是 gem 的一部分,将由具有不同数据库的多个应用程序使用,因此我宁愿远离数据库解决方案。


编辑

为简单起见,我只列出了一个类似这样的属性(帐户类型),但实际上有 3 或 4 个不同的属性都遵循相同的模式(帐户类别、帐户状态等也是如此)。


任何想法都非常感谢!

4

1 回答 1

1

虽然我仍然不确定我是否理解您的确切要求,但如果遇到您的问题,我会立即抛出我会写的内容。

class Account
  attr_accessor :type
  @@types = [:ABC, :DEF, :GHI]
  @@types_to_codes = {:ABC => "ABC", :DEF => "DEF", :GHI => "GHI"}
  @@types_to_descriptions = {:ABC => "Description for ABC", :DEF => "Description for DEF", :GHI => "Description for GHI"}

  def self.code_for(type)
    @@types_to_codes[type]
  end

  def self.description_for(type)
    @@types_to_descriptions[type]
  end

  def self.valid_type?(t)
    @@types.include?(t)
  end

  def is_type?(t)
    self.type == t
  end

  def description
    self.class.description_for(self.type)
  end
end

为了完全公平地解决您的问题,如果我提前了解您需要此类代码的所有属性,我会更进一步:我会以与代码库相同的方式对这些属性进行代码生成-为来自 Web 服务的数据片段生成代理。如果你想要一个例子,我很乐意为你提供一个。Ruby 真的让做这些事情变得非常容易。

附带说明:您还可以向Account该类添加一个构造函数,该构造函数采用 Nokogiri XML 片段并从中填充帐户字段。

我希望这对你有所帮助。

于 2013-05-13T18:41:23.903 回答