Использование наследования с RoR - PullRequest
2 голосов
/ 23 августа 2009

Я работаю над своим первым Rails-приложением (в этом смысле моим первым Ruby-приложением), и у меня есть вопрос передовой практики о наследовании. Я должен иметь возможность загружать физические носители, и я хочу хранить физические свойства отдельно в базе данных, чтобы некоторые атрибуты можно было запрашивать за пределами приложения так же легко, как и внутри. Для управления этим у меня есть таблица images Таблица binaries. Первый хранит метаданные, относящиеся к изображениям, конечно, в то время как последний хранит метаданные физического файла, которые будут применяться к ряду типов файлов. Как только мой подход укрепится, я добавлю таблицу swfs, таблицу videos и, возможно, другие.

На данный момент у меня класс BinaryObserver захватывает обратный вызов before_create изображения и загружает физический файл - двоичный файл. Это работает нормально, но мне интересно о других подходах. В частности, мне интересно, если бы я не смог (и не должен) установить базовую модель наследования, в которой Binary расширяет ActiveRecord::Base, а Image расширяет Binary.

В нынешнем виде Image belongs_to Binary и Binary has_one Image. Поскольку существует очевидная связь is-a, следует ли мне использовать наследование? Рельсы даже поддерживают такую ​​вещь при взаимодействии с базой данных? Это может быть лучшим способом уменьшить объем работы, необходимой для поддержки нового типа файлов.

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 августа 2009

К счастью, в рельсы встроено очень хорошее наследование одной таблицы.

К сожалению, вы ищете мульти-стол, и поддержка довольно унылая.

Посмотрите несколько примеров того, как люди реализовали такое:

http://zackham.com/2008/8/21/multiple-table-inheritance

http://github.com/sava/class_table_inheritance/tree/master

http://github.com/rwl4/inherits_from/tree/master

Или вы можете просто переключиться на наследование одной таблицы (хотя это побеждает ваш предыдущий комментарий):

class Binary < ActiveRecord::Base
end

class Image < Binary
end

и добавьте это к своей двоичной модели:

type VARCHAR(20) NOT NULL

Примеры:

@binaries = Binary.find(:all)

@images = Image.find(:all)
0 голосов
/ 23 августа 2009

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

0 голосов
/ 23 августа 2009

С точки зрения БД. Вам не нужна таблица двоичных файлов ... если вы сохраняете двоичные данные в базе данных, это просто свойство, похожее на дату ... вы не создадите таблицу дат :)

Сказать, что Image расширяет двоичный файл, потому что двоичный файл Image is is a Binary не точный, двоичный файл Image is-made-of, как Person, созданный из плоти (вы бы не сказали, Person расширяет Flesh)

В любом случае, есть плагин для вложений: attachment_fu , используйте его:)

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