0

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

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

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


饮食(id:整数,名称:字符串,todo_item_id:整数,created_at:日期时间,updated_at:日期时间)

class Diet < ActiveRecord::Base
  belongs_to :todo_item
end

处方(id:整数,名称:字符串,todo_item_id:整数,created_at:日期时间,updated_at:日期时间)

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

对不起我的英语不好:|

4

1 回答 1

1

也许你可以尝试不同的方法:

饮食.rb

has_many :todo_items, as: :todoable
after_create :create_todo_item

def create_todo_item
  todo_items.create
end

处方.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”模块并将其加载到您需要的每个模型上,但这是下一步

于 2013-06-13T21:32:45.370 回答