在Rails中键入类

时间:2012-04-23 16:08:13

标签: ruby-on-rails oop

我在Rails 3.2.2应用程序上有一个Ruby 1.9.3,我正在处理一些需要包含类型的has_many关联。例如:

  • 用户有很多飞机。该飞机属于某种类型(塞斯纳172)。
  • 用户拥有许多许可证。许可证属于某种类型(私人飞行员执照)。
  • 许可证具有很多评级。额定值属于某种类型(单引擎活塞等级)。

我的问题是命名所有这些类。现在,用户上的关联名为AircraftLicenseRating,但仍需要我命名类型类。我最初将它们命名为AircraftTypeLicenseTypeRatingType,但这闻到了我的味道。

现在我在专用模块Types中拥有所有这些类型类,因此我的类型类现在被命名为Types::AircraftTypes::LicenseTypes::Rating但我不确定如果这让我在路上遇到麻烦,因为我对Rails中的命名空间提出了可疑的支持。

这类问题是否有惯例或标准做法?

更新

由于飞机类型列表定期更新,我需要将它们放在数据库中。虽然许可证类型和评级更改频率较低,但如果我需要添加,更改或删除任何内容,我仍然希望它们位于数据库中。这种规则在类本身中静态地定义它们。

1 个答案:

答案 0 :(得分:2)

您可以将模型中的类型作为类方法,因为它们与模型紧密关联。类似的东西:

class Aircraft < ActiveRecord::Base
  def self.XTypes
     ['Cessna 172','Cessna 152','Boeing 747']
  end
end

只是不要使用'type',因为rails保留了单表继承,实际上'Types'甚至可能是危险的,但是,保持所有模型的属性名称相同会​​很好有类型,至少可以开辟DRYer代码的可能性,你可以在所有具有XTypes的模型之间共享一些代码,就像在视图助手中为任何具有XType的模型创建一个select元素。

所以,通常你会使用这样的XType:

<%= f.select 'xtype', Aircraft.XTypes %>

XType列表越大,修改/添加/删除的次数越多,您应该考虑将它们放在一个单独的模型中并将它们与has_one关系链接起来,但如果它们是相当静态的,那么上述方法可能没问题。

更新:

我认为单表继承可能是故障单,或者只是一个简单的has_one关系。但听起来你想要将所有这些类型压缩成一个实体,所以你可能想要STI

class mytype < ActiveRecord::Base; end
class AircraftType < mytype; end
class LicenseType < mytype; end

您只需在mytype模型中添加名为'type'的字符串属性,并使用值'AircraftType'或'LicenseType'填充它。现在您有一个可以容纳所有类型的模型,例如,如果您正在编辑许可证记录,并且需要选择LicenseTypes元素,则可以执行以下操作:

<%= f.select 'type', LicenceType.all().map {|t|, [t.id, t.description] }

如果您正在编辑飞机:

<%= f.select 'type', AircraftType.all().map {|t|, [t.id, t.description] }

这假设基本mytype模型具有属性'description'