Как моделировать множественные отношения в ActiveRecord? - PullRequest
1 голос
/ 25 июня 2010

Я пытаюсь завершить создание приложения Rails "Home Inventory" в качестве примера, чтобы помочь мне изучить рельсы.Ниже приводится общий обзор того, чего я пытаюсь достичь:

Основная цель этого приложения - показать страницу с подробной информацией.

Таким образом, http://localhost:3000/living-room-couch будет отображатьсяинформация о кушетке.

Каждый предмет может принадлежать одному (или имеет один?) Из трех категорий:

  1. Книга
  2. Мебель
  3. Электроника.

Книга обладает следующими свойствами:
- isbn,
- страницы,
- адрес,
- категория

Мебель имеет следующие свойства:
- цвет,
- цена,
- адрес,
- категория

Электроника имеет следующие свойства:
- имя,
- напряжение,
- адрес,
- категория.

-

Теперь на моей стороне Вид , у меня естьсделано 3 шаблона в рельсах, которые содержат элементы, подходящие для отображения элемента, принадлежащего к одной из 3 категорий.Шаблон для Book показывает isbn, а шаблон для Electronics показывает напряжение.

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

Элемент, принадлежащий_все или has_one , категория .Категория может быть одной из трех: Книга , Мебель или Электроника .

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

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


- или

Могу ли я просто пойти по этому пути (или присоединиться к модели, возможно):

class BookModel < ActiveRecord::Base
  has_many :categories
End

И затем выбрать, к какой категории относится, на основе названия модели.

Надеюсь, я правильно сформулировал вопрос, я просто так запутался в этом.

Спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 25 июня 2010

Почему бы не иметь Предмет, имеющий следующие отношения:

belongs_to :book
belongs_to :furniture
belongs_to :electronic

После этого вы можете только фактически установить их, и можете сделать тест

if item.book
#do things
end

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

0 голосов
/ 25 июня 2010

Модель Item может быть объявлена ​​полиморфной (см. Здесь: http://guides.rails.info/association_basics.html#polymorphic-associations)

так что вы объявите Item:

class Item < ActiveRecord::Base
  belongs_to :category, :polymorphic => true
end

тогда 3 модели, которые выступают в качестве категории (я покажу одну, остальные одинаковы):

 class Employee < ActiveRecord::Base
   has_one :item, :as => :category
 end

 # and so on...

таким образом, вы можете связать Предмет с одной из 3 моделей (Книга, Мебель и Электроника). каждый экземпляр этих моделей будет иметь атрибут «items», например:

@book.items # returns all the items associated to a @book object

Вы также можете использовать ассоциацию has_many, используя полиморфную модель.

Для представлений вы можете использовать вложенные объекты формы (см. Здесь: http://guides.rails.info/form_helpers.html)., в основном, в каждой форме вы должны вкладывать форму для создания объекта Item. Чтобы следовать примеру книги, вы получите как то так:

 <%= form_for :book, @book do |form| %>
   <%= form.text_field :isbn %>
   <!-- other fields -->
   <%= fields_for @book.item do |item_form| %>
      <%= item_form.text_field :name %>
   <% end %>
 <% end %>

надеюсь, это вам помогло;)

0 голосов
/ 25 июня 2010

Не думаю, что вам нужна модель category.Вы можете просто создать модели book, furniture и electronic и по одной controller для каждой.

Редактировать

Нет, преимуществ нет,Я только что сказал создавать разные модели / контроллеры, потому что то, что вы моделируете, на мой взгляд, разные вещи.Но если вы думаете, что у них будет много общего, я бы посоветовал вам использовать наследование одной таблицы.Таким образом, у вас будет одна таблица для каждого предмета и может быть только один контроллер, но у каждого предмета будет одна модель.

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