2012-04-23 35 views
0

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

  • 用户有很多飞机。这架飞机属于某种类型(塞斯纳172)。
  • 用户有许多许可证。这些许可证属于某种类型(私人飞行员执照)。
  • 许可has_many等级。评级属于某种类型(单发活塞级评级)。

我的问题是命名所有这些类。现在用户的关联被命名为Aircraft,LicenseRating,但这仍然要求我命名类型类。我最初有他们的名字叫AircraftType,LicenseTypeRatingType但这个味道给我。

现在我有一个专门的模块Types所有这些类型的类,所以我喜欢的类型类现在命名为Types::AircraftTypes::LicenseTypes::Rating但我不知道这有我遇到麻烦的道路给出了可疑的支持Rails中的命名空间我一直听到。

这种问题有没有一个惯例或标准做法?

更新:

由于飞机类型的列表会定期更新,我需要这些是在数据库中。尽管许可证类型和评分变化较少,但如果我需要添加,更改或删除任何许可证,我仍然更喜欢它们在数据库中。这种排除了静态地在类中定义它们的规则。

回答

2

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

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

只要不使用“类型”,如轨道预留,对于单表继承,其实“类型”甚至可能是危险的,但是,这将是很好的保留属性名称对于所有具有类型的模型都是一样的,至少可以打开DRYer代码的可能性,您可以在所有具有XType的模型之间共享一些代码,比如在视图帮助器中为任何模型创建select元素有一个XType。

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

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

的XTypes的大名单,他们是修改/添加/删除越容易出现,你应该考虑把他们在一个单独的模型并将它们与has_one关联关联起来,但如果它们相当静态,上述方法可能会很好。

UPDATE:

我认为单表继承可能是票,要么或只是一个简单的HAS_ONE关系。但是,这听起来像你想所有这些类型的凝结成一个单一的实体,所以你可能要STI

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

你只需要添加在你MYTYPE模式叫“类型”的字符串属性,并与填充在值'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模型有一个属性“描述”

+0

嗨布拉德,感谢您的快速响应!我的道歉,也许我应该更清楚。我需要这些类型在数据库中,因为它们可能会发生变化(飞机类型比其他类型更多),因此我的难题在于。我已更新我的原始问题 – Laurens 2012-04-23 17:18:53

+0

好的,我会更新我的答案 – RadBrad 2012-04-23 17:23:26

+0

谢谢布拉德!刚刚启动并运行,并非常喜欢这个解决方案,效果很好! – Laurens 2012-04-24 15:33:21