2011-10-30 5 views
0

Я создаю приложение, где у меня есть иерархические модули (голые со мной с абсурдными моделями, но концепция такая же), как у Animal есть Tracker, а у Tracker есть мобильный телефон , каждый со своим серийным номером ... (Animal animal_id: 10, Tracker serial_number: 12, Cellphone imei: 123456789123456)Rails has_one/принадлежит_от концептуальной дискуссии

Что было бы приемлемым способом определения отношений?

То, что я использую в настоящее время эта схема:

Animal has_one Tracker, Tracker has_one Cellphone 

Cellphone belongs_to Cellphoneable, Tracker belongs_to Trackable 

(Это полиморфные отношения)

Что у меня проблемы с пониманием, что я хранить cellphoneable_id в таблице сотовых телефонов, но Я начинаю думать, что отношения должны находиться в таблице Tracker и оставить мобильный телефон в одиночку и позволить верхним слоям относиться вниз.

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

+0

Просто так я вас правильно понял: Мобильный телефон на самом деле наследует от Cellphoneable и Tracker от отслеживаемых, правильно? Тогда это не отношение 'own_to' в rails-talk, а STI (однонаправленное наследование). – nathanvda

+0

Нет, это не наследование, они на самом деле разные модели –

ответ

0

Вот как я бы это сделать, если:

  1. Шпион принадлежит к одному животному и один сотовый телефон
  2. Если животное может иметь только один трекер
  3. Если мобильный телефон может быть подключен к нескольким трекер и, следовательно, несколько животных

Вот код:

class Tracker < ActiveRecord::Base 
    belongs_to :animal 
    belongs_to :cellphone 
end 

class Animal < ActiveRecord::Base 
    has_one :tracker 
    has_one :cellphone, :through => :tracker 
end 

class Cellphone < ActiveRecord::Base 
    has_many :trackers 
    has_many :animals, :through => :trackers 
end 
+0

Но, как они построены, есть только один сотовый телефон для трекера и один трекер для животного (здесь нет избыточности) ... –

+0

, тогда я бы удалите модель мобильного телефона и просто добавьте информацию о сотовом телефоне в виде столбцов в таблицу трекера. У животных есть своя таблица, но изменить 'has_many: trackers' на' has_one: tracker' – sled

+0

Мне это не понравится, потому что sms-специфические методы полезны только для мобильных телефонов ... я бы смешивал функциональность между моделями. .. –

Смежные вопросы