Как правильно обрабатывать «типы» в Rails? - PullRequest
0 голосов
/ 05 декабря 2009

извините, если этот вопрос задавался ранее, я искал, но не был уверен в правильном названии того, что ищу.

Я в значительной степени новичок в рельсах и разработке в целом, я занимался хакерским программированием, но я бы не сказал, что знаю, что делаю. Я всегда был в замешательстве, как определять «типы» в моих моделях Rails и в базах данных в целом.

Например, скажем, у меня есть модель "Автомобиль", и у нее есть свойство "Цвет", где цвет выбирается из известного набора, а не значения RGB или чего-либо еще. Что-то подсказывает мне, что должна быть другая таблица (и связанная модель) для Color, а затем должны быть какие-то отношения между ними, но какое отношение подходит? Автомобиль не относится к своему цвету, или наоборот.

Или, конечно, я мог бы просто сохранить целое число и посмотреть его в коде, но мне это кажется неправильным.

Что я пропустил? :)

Ответы [ 4 ]

0 голосов
/ 06 декабря 2009

Цвет может быть сложным или очень простым, в зависимости от того, что вам нужно.

  • Простой: целочисленное значение, впоследствии преобразованное в любой другой формат, или шестнадцатеричное значение, например «a3ab34», сохраненное в строке.
  • Сложный: вы хотите сопоставить цвета с определенными человеческими названиями.

Для простоты у вас будет только колонка в автомобилях с именем color, и вы переопределите метод считывателя, чтобы возвратить любой желаемый формат цвета, например.

class Car < ActiveRecord::Base
  def color(format = :integer)
     case format
     when :integer: super
     when :hex: # ... hex conversion code
     # ... more conditions ...
     end
  end
end

Если мы говорим о сложном случае, то он другой. Затем у вас должна быть отдельная модель под названием Color. Тогда Car будет belongs_to :color как сказано выше. Было бы более семантически правильным сказать Car has_one :color, но тогда вы заставляете таблицу цветов хранить car_id, что было бы отчасти назад. В нашем случае автомобиль будет хранить color_id. Поэтому убедитесь, что вы выполняете миграцию, которая добавляет color_id к таблице cars.

Затем вы должны создать миграцию для таблицы colors, которая будет включать в себя, например, id, title и code, и которую вы должны будете предварительно заполнить, используя материал для посева на рельсы. (см. http://railscasts.com/episodes/179-seed-data)

0 голосов
/ 05 декабря 2009

Мой опыт работы с типами в Ruby таков, что вместо того, чтобы думать о том, что что-то является , вы должны думать о том, что что-то делает . В этом отношении это очень jQuery, не спрашивайте, какой браузер использует пользователь, а может ли его браузер делать то, что нам нужно.

Я знаю, что это был не главный вопрос вашего вопроса, но это показалось подходящей аналогией, учитывая название и мой собственный опыт изучения Ruby и работы с типизацией утки.

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

Именование всегда было немного странным для меня, я только что узнал, что принадлежат - это модель, которая имеет идентификационный номер. У этого есть свои причины, но легче запомнить этот факт, чем пытаться каждый раз распутывать логику. Это все, что вы действительно должны держать прямо, и у вас все будет хорошо. :)

0 голосов
/ 06 декабря 2009

Для этого примера я не считаю целесообразным хранить цвет автомобиля в отдельной модели. Цвет - это свойство автомобиля, поэтому столбец в таблице автомобилей - это решение.

Если вы хотите ограничить выбор цветов конечным списком, вы можете использовать проверку

class Car < ActiveRecord::Base
  validates_inclusion_of :colour, :in => %w( red orange yellow green blue indigo violet )
end

Если это слишком упрощенно для вашего варианта использования, я рекомендую вам взглянуть на ActiveRecord :: Aggregations :: ClassMethods.composed_of . Я не думаю, что модель ActiveRecord является здесь решением.

0 голосов
/ 05 декабря 2009

Автомобиль имеет только 1 цвет, так что вы бы сказали Car экземпляр belongs_to его Color. Тем не менее, ваша вторая идея просто сохранить цвет в виде числа и определить эти цвета как константы где-то, вероятно, более разумно ... если вам не нужно добавлять / удалять / редактировать цвета в приложении (другими словами, ' жить »).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...