Rails: Если Foo has_many: bars, все ли: bars должны принадлежать Foo? - PullRequest
4 голосов
/ 23 февраля 2011

Я работаю над приложением, в котором много фотографий, добавленных пользователями.Аспект обмена фотографиями является основной целью приложения.

Иногда полезно создавать избранные «коллекции» фотографий.Итак, это достаточно просто в ActiveRecord: Collection has_many :photos и Photo belongs_to :collection.

Вопрос, который у меня возникает, для «обычной» фотографии, которая не принадлежит специальной коллекции, должен ли я:

A.Он не принадлежит ни к одной коллекции. , т. Е. photo.collection == nil

-или-

B.Создайте общую «коллекцию сообщества», в которой хранятся все фотографии. т.е. по умолчанию photo.collection == 'Community'

Я также рассматриваю вопрос о том, должно ли это быть отношение HABTM.

Обратная связь будет принята с благодарностью!

Ответы [ 3 ]

7 голосов
/ 23 февраля 2011

На самом деле это зависит от того, что вы собираетесь делать со своими несобранными фотографиями. Если вам нужна возможность показывать несобранные фотографии с помощью того же действия, которое вы используете для показа коллекции, то вам нужна эта общая коллекция. В противном случае я бы оставил это ноль; Мне не нравится смешивать «начальные» данные с пользовательскими данными в одной и той же таблице (что вы будете делать с «несобранной» коллекцией) - слишком легко случайно стереть ваши пользовательские данные при повторном заполнении.

Должны ли это быть отношения HABTM? Опять же, зависит от того, как вы хотите его использовать. Если есть большая вероятность, что фотографии будут принадлежать нескольким коллекциям, сделайте это.

И то, что я видел здесь, упомянуло здесь, что я бы не сделал: добавив атрибут 'ptype', чтобы сообщать синглетам из собранных фотографий (пустое пространство БД - вы уже можете получить эту информацию, вызов photo.collection_id.nil?); и использование полиморфных моделей (я полагаю, вы не хотите, чтобы одноэлементные фотографии вели себя по-разному, так что это усложняет процесс, принося мало пользы).

Именные области, тем не менее, являются отличной идеей и будут особенно полезны, если у вас нет коллекции «uncollected» для поиска синглетонов по:

#Apologies for the Rails 2.3 code - it's what I know...
named_scope :singletons, {:conditions => {:collection_id => nil}}

Или версия HABTM:

named_scope :singletons, lambda {
    {:conditions => ['NOT EXISTS (SELECT * FROM collections_photos WHERE photo_id = ?)', self.id]}
}

Надеюсь, это поможет!

1 голос
/ 23 февраля 2011

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

1 голос
/ 23 февраля 2011

А как насчет использования атрибута ptype? У вас может быть photo.ptype = 'collection' или photo.ptype = 'single'. Таким образом, вы сможете идентифицировать каждую фотографию по этому типу. Кроме того, вы можете сделать его еще более элегантным, используя область на фотографиях и указав область видимости collection_photos или single_photos.

Другая возможность - полиморфные модели. Имейте фотомодель и коллекцию фото и модель одного фото, которые ее используют.

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