#ruby-on-rails #activerecord #abstraction #abstract-data-type
#ruby-on-rails #activerecord #абстракция #абстрактный тип данных
Вопрос:
Каков наилучший способ абстрагирования атрибута ActiveRecord без дальнейшей нормализации базы данных?
Например, давайте предположим, что таблица базы данных с именем, addresses
содержащим столбец zip_code
, и метод определения, является ли почтовый индекс допустимым:
class Address < ActiveRecord::Base
def zip_code_valid?
..
end
end
Я бы предпочел иметь:
class Address < ActiveRecord::Base
..
end
class ZipCode
def valid?
..
end
end
и когда я выполняю Address.find(1).zip_code
, он возвращает ZipCode
вместо строки. Я бы предпочел не нормализовать базу данных путем создания таблицы с именем zip_codes
. Пример гипотетический, и в настоящее время у меня нет реального примера этого; Я просто хочу знать, как я потенциально мог бы это сделать.
Спасибо.
Ответ №1:
Я не уверен, почему вы хотели бы сделать это для ZipCode
, как вы обсуждали, но чтобы ответить на ваш вопрос, вам следует рассмотреть возможность использования агрегатов Rails.
Вот документация :
http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html
Если у вас есть конкретные вопросы о том, чего вы хотите достичь, дайте мне знать, и я постараюсь ответить на эти конкретные вопросы.
Комментарии:
1. Спасибо. Пример с адресом и почтовым индексом был примером, который я быстро придумал, чтобы объяснить, что я хотел бы потенциально сделать. Я пытаюсь найти наилучший способ абстрагирования атрибута ActiveRecord без дальнейшей нормализации базы данных. Я посмотрю документацию, на которую вы ссылались.
2. Я так и предполагал. Я делал то же самое много раз, это проще объяснить на примере, но иногда трудно придумать простой для описания пример, который имел бы смысл. Я надеюсь, вы найдете то, что ищете, в Aggregations. Дайте мне знать, если у вас возникнут какие-либо проблемы.
Ответ №2:
Я не думаю, что абстрагирование почтового индекса в класс имеет смысл, если вы не собираетесь делать то же самое с улицей, номером дома, городом и т.д. У вас уже есть это как отдельный столбец в таблице адресов, поэтому нет смысла хранить его в его собственном классе (с точки зрения ActiveRecord). В качестве альтернативы, если вы храните почтовые индексы в их собственной таблице (и, следовательно, классе), что вы получаете? На мой взгляд, хранить один атрибут в отдельном классе / таблице слишком далеко, если это имеет смысл как часть совокупности, в которой он находится в данный момент.
Комментарии:
1. Спасибо. Это гипотетический вопрос о доведении абстракции до предела. Этот вопрос пришел мне в голову прошлой ночью, когда я читал Code Complete и раздел об абстрактных типах данных. Хотя это может зайти слишком далеко, давайте предположим, что в будущем будет пара десятков методов, которые относятся только к почтовому индексу, и в этом случае, я считаю, было бы полезно абстрагировать методы в почтовый индекс против адреса.
2. Если вы собираетесь выносить суждение по вопросу, вы должны, по крайней мере, сначала предоставить ответ.
3. @джесси — Ты издеваешься надо мной? Вы понимаете, что я дал правильный ответ? Мой ответ заключается в том, что он должен придерживаться первого предоставленного им примера, а не абстрагировать его в свой собственный класс. Другой избиратель понял это и проголосовал за меня. Очевидно, что я прочитал вопрос, если предоставил подробный ответ о том, почему ему следует избегать размещения zip code в его собственном классе.
4. @McStretch, Эндрю спросил сообщество, как «взять атрибуты ActiveRecord и абстрагировать их?» вы сказали ему, что он не должен абстрагировать это, разве это не отказ? Далее, вы спросили его: «Если вы храните почтовые индексы в их собственной таблице, что вы получаете?» когда он четко заявил, что не хочет хранить почтовые индексы в их собственной таблице. Это означало бы, что вы не внимательно прочитали вопрос. Наконец, ваше предположение о том, что для нового класса требуется новая таблица базы данных, ошибочно. Я отклонил ваш ответ по всем этим причинам.
5. @jesse — Как это отсутствие ответа подтверждает, что способ, которым он изначально это сделал, может быть лучшим? Что касается вашего второго пункта, сохранение почтового индекса в другом классе может идти рука об руку с созданием новой таблицы (что он признает, говоря: «Я бы предпочел не нормализовать базу данных, создавая таблицу с именем zip_codes.»), поэтому важно принять это во внимание. Я не сказал, что это всегда так, но моя точка зрения напрямую направлена на его точку зрения о том, чтобы избежать создания новой таблицы. И угадайте, что? Его первоначальное решение, которое я одобрил, делает именно это.