在 Rails 中存储清单结果的好方法是什么?

What would be a good approach for storing the results of a checklist in Rails?

问题:

我需要创建一个允许 "admin" 用户创建清单的应用程序。每个 清单 有:许多 。用户将能够根据自己的选择在清单中添加和删除项目。 (通过像 Cocoon 这样的 gem,因为它可以优雅地处理嵌套资源。)

示例表单如下所示:


清单

  1. 项目
  2. 项目
  3. 项目

[添加项目 +]


创建表单后,普通用户就可以complete/follow 核对清单。选中的是 good/true,未选中的是 bad/false.


汽车

  1. 检查机油 [复选框]
  2. 检查轮胎 [复选框]
  3. 检查灯光 [复选框]

[提交]


这是困难的部分。我考虑过的一种方法...

创建属于清单模型的记录模型,

清单

   class Checklist < ActiveRecord::Base
      has_many :records
    end

记录

class Record < ActiveRecord::Base
  belongs_to :checklist
end

然后,将结果序列化为散列...

class Record < ActiveRecord::Base
  belongs_to :checklist

  serialize :list_history, Hash
end

我会使用 item.id 作为键,用户 true/false 输入作为值。因此,存储的结果类似于:

[ 2 => true, 54 => true, 34 => false]

这样,用户可以多次完成清单,然后 "admin" 可以调出以前清单的结果。

问题 A

这似乎可行,除非 "admin" 用户想要编辑清单。如果他们从清单中删除 "item",即使我可以从关联中删除 "item","item" 也必须保留在数据库中。否则,如果 Oil 的 ID 为 2,并且 Oil 在编辑中被删除,那么记录的 list_history 散列将具有 [2 => true],这是一个指向任何地方的键。我可以想象积压的物品堆积如山。

问题 B

我不确定这是否是解决此问题的最佳方法。我已经使用 rails 2 1/2 年了,但感觉仍然和第一天一样。(实际上,我觉得我知道的更少。)也许有更好的解决方案角落,我还没有想到。

这真的应该是评论。

也许结构如下:

class Checklist < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :checklist
  has_many :user_items, dependent: :destroy
  has_many :users, through: :user_items
end

class UserItem
  belongs_to :item
  belongs_to :user
end

class User
  has_many :user_items, dependent: :destroy
  has_many :items, through: :user_items
end

清单 整个列表

每个任务

user_item 关系上的依赖销毁将在销毁时删除与父关联的记录。(解决问题 A

用户项 为每个用户条目加入 table。

用户 您的用户模型。