任何对象类型的待办事项列表的最佳方式

时间:2013-06-13 21:02:11

标签: ruby-on-rails ruby activerecord

我需要创建一个包含任何对象类型的待办事项列表。将成为名单一部分的对象:饮食,处方和兽医咨询。

我每小时制作:将对象类保留在object_type列上,当我获得对象时,使用.send(TodoItem.x.object_type)方法。这是最好的方法吗?我想使用序列化选项,但我不知道如何。

为此,我创建了这个结构:


饮食(id:整数,名称:字符串,todo_item_id:整数,created_at:datetime,updated_at:datetime)

class Diet < ActiveRecord::Base
  belongs_to :todo_item
end

处方(id:整数,名称:字符串,todo_item_id:整数,created_at:datetime,updated_at:datetime)

class Prescription < ActiveRecord::Base
  belongs_to :todo_item
end

TodoItem (id:integer,name:string,done_date:date,is_done:boolean,created_at:datetime,updated_at:datetime,object_type:string)

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

抱歉我的英语不好:|

1 个答案:

答案 0 :(得分: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

并且在您需要的其他每个型号上都可以使用上面的代码

在TodoItem.rb中你所要做的就是

belongs_to :todoable, polymorphic: true

在TodoItem上创建字段todoable_type和todoable_id

看起来好多了IMO。即使这样,也可以进一步重构它,创建一个“todoable”模块并将其加载到您需要的每个模型上,但这是下一步