2016-09-28 1 views
0

Мой сценарийActive Record Рельсы Наследование - Авто Приведение типов в зависимости от типа


-> Пользователь имеет много машин

-> Машины могут иметь 5 видов

-> каждая машина тип имеет свой собственный механизм обработки.

-> Я хочу использовать столбец типа, чтобы узнать, к какому классу принадлежит эта строка. (Подход наследования Rails), как описано в этой ссылке Link.


Мой вопрос


-> доступ к машине из базы данных, например, машины = Machine.first

-> затем вызвать machine.process (этот метод процесс должен быть назван на основе по типу этой машины). (Я ожидаю, что здесь будет какой-то материал для литья).

Примечание. Каждый тип машины имеет свою реализацию процесса, отличную от другой и реализованную в своем классе.

Я хочу знать лучший подход к реализации этого. Любая помощь приветствуется.

ответ

1

Вы можете реализовать родительский класс Machine с общими логическими и дочерними классами с личной логикой.

rails g model machine type:string customer_id:integer 
mkdir app/models/machines 
touch app/models/machines/bmw.rb 
touch app/models/machines/renault.rb 
... 

приложение/модели/machine.rb

class Machine < ActiveRecord::Base 
    belongs_to :customer 
    ... 
    def country 
    raise NotImplementedError 
    end 
end 

приложение/модели/машины/bmw.rb

class Bmw < Machine 
    ... 
    def country 
    :germany 
    end 
end 

приложение/модели/машины/Opel. rb

class Renault < Machine 
    ... 
    def country 
    :france 
    end 
end 

Например:

  • Первый BMW Bmw.first
  • Первый любой автомобиль Machine.first
  • Получить клиент первый Renault Renault.first.customer
  • Страна любой автомобиль Machine.all.sample.country, этот метод будет вызывать из любого класса ребенка.
+0

если мы делаем, как это, где первая строка БМВ типа класса. Machine.first.country Какой метод будет называться? Машина или BMW? –

+0

bmw. Если класс детей не имеет никакого метода, он вызывает из родительского класса. –

+0

мое требование было как это u.machines.each do | m | #call детский метод здесь для его конкретной логики #for bmw его собственный метод следует называть и т. Д. конец –

0

После того, как в течение некоторого времени я смог найти драгоценный камень, который дал мне именно то, что я хотел.

active_record-acts_as Gem.

Другие ссылки, которые я нашел полезными были:

Link1

Link2

Link3

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