Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在类成员/枚举中表示属性的可能值?_Ruby On Rails_Ruby_Class_Rubygems - Fatal编程技术网

Ruby on rails 如何在类成员/枚举中表示属性的可能值?

Ruby on rails 如何在类成员/枚举中表示属性的可能值?,ruby-on-rails,ruby,class,rubygems,Ruby On Rails,Ruby,Class,Rubygems,我正在访问一个web服务,它以XML的形式返回数据,并填充到自定义模型中。其中一个节点称为AccountType,它有两个子节点、代码和描述 因此,从web服务返回,它看起来是这样的: ... <AccountType> <Code>ABC</Code> <Description>Description for ABC</Description> </AccountType> ... if (myAccount.a

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

因此,从web服务返回,它看起来是这样的:

...
<AccountType>
  <Code>ABC</Code>
  <Description>Description for ABC</Description>
</AccountType>
...
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
将其传输到自定义模型后,可以通过编程方式从Account类的实例访问这些值,如下所示:

myAccount.account_type_code
=> ABC
myAccount.account_type_description
=> Description for ABC
帐户类型有少量可能的值,我需要能够根据帐户关联的帐户类型编程逻辑。因此,我想列举Account类中可能的值,目标是能够编写如下代码:

...
<AccountType>
  <Code>ABC</Code>
  <Description>Description for ABC</Description>
</AccountType>
...
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
另一个让我感到复杂的方面是,存在与帐户类型相关联的代码和描述,因此枚举的定义可能需要如下所示:

...
<AccountType>
  <Code>ABC</Code>
  <Description>Description for ABC</Description>
</AccountType>
...
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
这将需要如下逻辑:

...
<AccountType>
  <Code>ABC</Code>
  <Description>Description for ABC</Description>
</AccountType>
...
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个不同的属性都遵循相同的模式(也包括帐户类、帐户状态等)



任何想法都非常感谢

虽然我还不能确定我是否理解您的确切要求,但如果遇到您的问题,我将立即放弃我将要写的内容

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片段并从中填充Account字段


我希望这对您有所帮助。

就我个人而言,如果代码没有那么多,我会创建N个小类,对它们的字段进行硬编码。然后你可以利用Ruby的语法,比如:
myAccount.is_a?(AbcAccount)
。如果类很多,您可以只编写生成的代码。当您真正拥有类继承时,很少有理由去模仿它。此外,如果值动态更改,也会有所帮助。询问详情如果你不能弄明白,我很乐意帮助你。我编辑了这个问题,补充说有多个类似这样的属性;我想我简化问题的初衷实际上忽略了一个重要方面。这改变了对继承的建议,不是吗?谢谢你的时间,我很感激!不过,这并不能说明什么。我想了解您到底想要实现什么,以及为什么使用if/else语句对您来说太多了。您始终可以创建包装器方法,如
acct.is\u type?(:ABC)
acct.is\u status?(:paid)
。如果你的目标是某种多态性,请说明你的要求。不,目前不寻求多态性,但我认为不能排除进一步发展的可能性。这里的主要目标是在检查帐户类型/类/状态的方便性和抽象性与这些属性同时具有代码和描述这一事实之间取得平衡。如果他们没有描述,那么一个简单的符号表示就是我的路线,但我可能有点想过头了。将结合使用我的“复杂枚举”实现和包装器方法。如果你想提交答案,我会做标记,否则我会回答-再次感谢@伊兰索,请原谅,我应该读得更好。