2013-06-13 3 views
0

Мне нужно создать список задач с любыми типами объектов. Объекты, которые будут частью списка: диета, рецепт и ветеринария.Лучший способ для списка задач с любыми объектами типа

В течение часа я сделал: Храните класс объекта в столбце object_type, и когда я получу объект, используйте метод .send (TodoItem.x.object_type). Это лучший способ? Я думал использовать параметр сериализации, но я не понимаю.

А для этого я создать эту структуру:


Diet (ID: целое, имя: строка, todo_item_id: целое число, created_at: DATETIME, updated_at: DateTime)

class Diet < ActiveRecord::Base 
    belongs_to :todo_item 
end 

Предписание (id: integer, name: string, todo_item_id: integer, created_at: datetime, updated_at: date Время)

class Prescription < ActiveRecord::Base 
    belongs_to :todo_item 
end 

TodoItem (ID: целое число, имя: строка, done_date: дата, is_done: логическое значение, created_at: Дата и время, updated_at: DateTime, тип_объект: строка)

class TodoItem < ActiveRecord::Base 
    has_one :diet 
    has_one :prescription 

    def related 
    self.send(self.object_type) 
    end 
end 

На контроллерах я сделать:

class PrescriptionsController < ApplicationController 
    before_filter :create_todo_item, only: [:create] 
    def create 
    @prescription = Prescription.new(prescription_params) 
    @prescription.todo_item = @todo_item 
    ... 
    end 

class ApplicationController < ActionController::Base 
    def create_todo_item 
    @todo_item = TodoItem.new(object_type: params[:controller].singularize) 
    @todo_item.save 
    end 
end 

Извините за мой бедный английский: |

+0

Я хочу связать больше типов объектов с будущим, создав новое отношение для каждый класс ... – Ronan

+0

Невозможно создать дополнительные ассоциации без явного объявления отношений в моделях. – zeantsoi

+0

Недавно я ответил на аналогичный вопрос: http: // stackoverflow.com/questions/17029659/model-attribute-contains-collection-of-object/17031165 # 17031165 –

ответ

1

Может быть, вы могли бы попробовать другой подход:

Diet.rb

has_many :todo_items, as: :todoable 
after_create :create_todo_item 

def create_todo_item 
    todo_items.create 
end 

Prescription.rb

has_many :todo_items, as: :todoable 
after_create :create_todo_item 

def create_todo_item 
    todo_items.create 
end 

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

В TodoItem.rb все, что вам нужно сделать, это

belongs_to :todoable, polymorphic: true 

И создать поля на TodoItem todoable_type и todoable_id

выглядит намного лучше IMO. Даже в этом случае можно продолжить рефакторинг, создав модуль «todoable» и загрузить его на каждую нужную вам модель, но это следующий шаг.

+0

Да, Anezio, я делаю это, и я использую проблемы, чтобы сделать способ ho создать thee todo_item каждый новый объект;) Thnks! – Ronan

+0

Полный код: [gist] (https://gist.github.com/ronanrodrigo/5778496) – Ronan

+0

Приятно! Но я думаю, вы могли бы заменить этот 'TodoItem.create (item_type: self.class.name, item_id: self.id)' на этот 'todo_item.create'. Полиморфные ассоциации автоматически устанавливают значения для типа и id. Взгляните в документацию здесь о том, как это работает http://guides.rubyonrails.org/association_basics.html#polymorphic-associations –

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