has_many: через наследование объекта - PullRequest
0 голосов
/ 12 марта 2011

Я пытаюсь создать приложение, в котором у Пользователей есть много Предметов, и каждый Предмет, который они имеют через Владение, является самостоятельным объектом. Идея заключается в том, что если у меня есть элемент MacBook, например, и пользователь добавляет его в свой инвентарь, он может применять к нему атрибуты (фотографии, комментарии, теги и т. Д.), Не затрагивая непосредственно сам элемент, только свое владение.

Предмет, в свою очередь, будет собирать атрибуты из соответствующих им владений (если вам нужно перейти в / item / MacBook, а не в / user / 101 / обладание / 5). У меня есть следующие настройки моделей (пока игнорируются такие атрибуты, как фотографии).

class User
    has_many :possessions
    has_many :items, :through => :possessions
end

class Item
    has_many :possessions
    has_many :users, :through => possessions
end

class Possession
    belongs_to :user
    belongs_to :item
end

Мой первый вопрос: правильно ли я делаю это? Есть has_many: через правильный инструмент здесь?

Если это так, как бы я справился с наследованием классов здесь? Я мог бы не утверждать это правильно, но я имею в виду, что если бы я сделал что-то вроде

@possession = Possession.find(params[:id])
@photos = @possession.photos.all

и не было доступных фотографий, как он мог вернуться к соответствующему пункту и найти принадлежащие ему фотографии?

1 Ответ

0 голосов
/ 12 марта 2011

Ваша исходная структура данных кажется подходящей.

Что касается второй части, с "отступлением" к соответствующему пункту, я не думаю, что был бы прямой способ Active Record сделать это. Такое поведение кажется довольно специфичным и может сбить с толку будущих разработчиков, работающих над вашим приложением, если у вас нет четкого метода для этого.

Вы можете создать метод внутри Possession, например:

def photos_with_fallback
   return self.photos if self.photos.size > 0
   self.item.photos
end

имеет огромное значение *1012* для этого. Если у вас есть такой метод, вы не сможете выполнять какие-либо действия записи, такие как @photos.build или @photos.create, потому что вы не будете знать, куда их помещать. Они могут быть связаны с Item или Posession.

Я думаю, что вам лучше выдвинуть условную логику на контроллер и проверить фотографии сначала на Posession, а затем на Item.

#In the controller
@photos = @posession.photos
@photos = @posession.item.photos if @photos.size == 0

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

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