2012-04-23 2 views
0

У меня есть приложение Ruby 1.9.3 on Rails 3.2.2, и я имею дело с рядом ассоциаций has_many, которым необходимо включить тип. Например:Типы классов в Rails

  • У пользователя много самолетов. Самолеты имеют определенный тип (Cessna 172).
  • У пользователя есть много лицензий. Лицензии имеют определенный тип (Private Pilot License).
  • Лицензия имеет номинальные_знания. Рейтинги имеют определенный тип (Single Engine Piston-Class Rating).

Моя проблема заключается в названии всех этих классов. В настоящее время ассоциации пользователя называются Aircraft, License и Rating, но это все еще требует, чтобы я назвал типы классов. Сначала я их назвал AircraftType, LicenseType и RatingType, но это пахло мне.

Сейчас у меня есть все эти классы типа в специальном модуле Types, так что мои классы типа теперь называется Types::Aircraft, Types::License и Types::Rating, но я не уверен, если это имеет меня заголовок на неприятность вниз по дороге, учитывая сомнительную поддержку Я продолжаю слышать об именах в Rails.

Существует ли конвенция или стандартная практика для такого рода проблем?

Update:

Поскольку список типов воздушных судов, регулярно обновляется, мне нужно, чтобы они были в базе данных. Хотя типы лицензий и рейтинги меняются реже, я все же предпочел бы, чтобы они были в базе данных, если мне нужно добавлять, изменять или удалять какие-либо. Этот тип правил определяет их статически в самих классах.

ответ

2

Вы можете поместить типы в модели как метод класса, потому что они настолько тесно связаны с моделью. Что-то вроде:

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

Просто не использовать «тип», как рельсы зарезервировали, что для одной таблицы наследования, на самом деле «Типы» может быть даже опасна, НО, было бы неплохо, чтобы сохранить имя атрибута то же самое для всех ваших моделей, которые имеют типы, которые, по крайней мере, открывают возможность кода DRYer, вы могли бы поделиться некоторым кодом между всеми моделями, которые имеют XTypes, например, в помощнике вида, который создает элемент выбора для любой модели, которая имеет XType.

Таким образом, как правило, вы будете использовать XTypes так:

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

Чем больше список XTypes, и тем более склонны они к пересмотру/добавлений/удалений, вы, вероятно, следует рассмотреть вопрос о создании их в разделить модель и связать их с отношением has_one, но если они довольно статичны, вышеупомянутый подход, вероятно, будет прекрасен.

UPDATE:

Я думаю, Single Table Inheritance может быть билет, или это, или только простые отношения 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

+0

Хорошо, я обновлю свой ответ – RadBrad

+0

Спасибо, Брэд! Просто придумал и очень предпочитаю это для своего решения, отлично работает! – Laurens

Смежные вопросы