我在Rails 3.2.2应用程序上有一个Ruby 1.9.3,我正在处理一些需要包含类型的has_many关联。例如:
我的问题是命名所有这些类。现在,用户上的关联名为Aircraft
,License
和Rating
,但仍需要我命名类型类。我最初将它们命名为AircraftType
,LicenseType
和RatingType
,但这闻到了我的味道。
现在我在专用模块Types
中拥有所有这些类型类,因此我的类型类现在被命名为Types::Aircraft
,Types::License
和Types::Rating
但我不确定如果这让我在路上遇到麻烦,因为我对Rails中的命名空间提出了可疑的支持。
这类问题是否有惯例或标准做法?
更新
由于飞机类型列表定期更新,我需要将它们放在数据库中。虽然许可证类型和评级更改频率较低,但如果我需要添加,更改或删除任何内容,我仍然希望它们位于数据库中。这种规则在类本身中静态地定义它们。
答案 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'