0

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

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

我的问题是命名所有这些类。现在用户上的关联被命名为Aircraft,LicenseRating,但这仍然需要我命名类型类。我最初将它们命名为,AircraftType但这对我来说很臭。LicenseTypeRatingType

现在我在一个专门的模块中拥有所有这些类型类Types,所以我的类型类现在被命名了,Types::Aircraft但是我不确定这是否会让我在路上遇到麻烦,因为我一直听说 Rails 中对命名空间的支持存在问题。Types::LicenseTypes::Rating

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

更新:

因为飞机类型列表会定期更新,所以我需要将这些放在数据库中。虽然许可证类型和等级的更改频率较低,但如果我需要添加、更改或删除任何内容,我仍然希望它们存在于数据库中。这种排除在类本身中静态定义它们的可能性。

4

1 回答 1

2

您可以将模型中的类型作为类方法放入,因为它们与模型紧密相关。就像是:

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

只是不要使用“类型”,因为 rails 为单表继承保留了它,实际上“类型”甚至可能是危险的,但是,对于所有具有类型的模型,保持属性名称相同会​​很好,这至少打开了 DRYer 代码的可能性,您可以在所有具有 XType 的模型之间共享一些代码,例如在为任何具有 XType 的模型创建选择元素的视图助手中。

因此,通常您会像这样使用 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 模型具有属性“描述”

于 2012-04-23T16:50:37.387 回答