我需要创建一个包含任何对象类型的待办事项列表。将成为名单一部分的对象:饮食,处方和兽医咨询。
我每小时制作:将对象类保留在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
抱歉我的英语不好:|
答案 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”模块并将其加载到您需要的每个模型上,但这是下一步